def evolution(island):
    """
    Infinite generator for evolution of some population.
    This generator yields population:
        population - tuple together containing tuples/individuals

    population_0 = create()
    population_1 = evolve(population_0, info_0)
    .
    .
    population_k = evolve(population_k-1, info_k-1)
    .
    .

    Since population is a tuple/an immutable type, a population cannot be
    influenced by outside functions. Population can be used only to gather
    statistics

    If no immigration and emmigration is used this island evolution
    becomes a classical genetic algorithm.
    """
    population = island.create_population()
    while True:
        for _ in range(island.migration_interval if island.migrate else 1):
            yield population
            if island.assimilate:
                population = island.assimilate(population)
            population = island.evolve(population)
        if island.migrate:
            island.migrate(population)
