I'm a bit new to this stuff, so I'm wondering: how do other pure-functional languages handle iterators? Are they some weird exception? Are they not allowed in pure contexts at all (done using IO monads or something, perhaps)? Do you need full-on move semantics to work with them properly? Is there a strategy for automatically "cloning" an iterator? What are the different approaches here?
I'd prefer to keep my language as simple as possible, so I'd rather avoid going down too deep of a rabbit-hole, even if it means bending the definition of "pure" a little bit.