Filtering a list by unfolding

ID: filtering-a-list-by-unfolding

For a predicate , normalize the state to the first remaining passing element with seek = dropWhile (not . p). Stop on an empty state, otherwise emit its head and continue from seek (tail state). The invariant is that every nonempty state starts with a passing element. An initial seek establishes it; removing the emitted head and seeking again preserves it. Each rejected run is traversed once, giving linear time in the examined input prefix under constant-cost predicate tests.

New to topics? Read the docs here!