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(func, cond, *args, **kwargs): for a, b in chunk_iterable(iterate(func, *args, **kwargs), chunk_size=2): if cond(a, b): return a