from itertools import takewhile, starmap, islice, repeat from operator import truth from funcy import iterate def chunk_iterable(iterable, chunk_size): return takewhile(truth, map(tuple, starmap(islice, repeat((iter(iterable), chunk_size))))) def until_convergence(func, *args, **kwargs): for a, b in chunk_iterable(iterate(func, *args, **kwargs), chunk_size=2): if len(a) == len(b): return a