@Szabolcs Is this similar to the inside of NDSolve, where NDSolveProcessEquations makes an NDSolveStateData object, which NDSolve`Iterate updates for a given time, which can then be repeated?
In principle, the state could be stored as a Mathematica expression. There are two potential problems with this: 1. does it have a performance impact? 2. how does one deal with this when the algorithm is implemented in C, especially when using a library?
It's certainly doable though.
My main point is that the iterator concept is extremely useful, and would benefit Mathematica in combinatorial applications.
@Szabolcs see Names["GeneralUtilities`*Iterator*"]. I discovered that it was built in already when I was working on making my own. On the other hand having built-ins return iterators would be pretty cool.