functional iterators that return the same object type as passed in