I completely agree with this. Personally, I think that something along the lines of Haskell-style lazy lists fits best with WL's paradigms. In the past I did an exercise to try an implement this from scratch, though I'm aware that similar functionalities are already hidden in the language. The advantage of lazy lists is that you can capture the stateful part of the iteration in the held tail of the list explicitly. So you can have a function that extracts a few elements from the lazy list and then also returns the tail to allow further extraction of elements.