>>> Basically, I added back in a super-minimal protocol to fill the
>>> structural gap left by Sequence. I call it “IteratorProvider” and it
>>> only has a single function which vends an iterator. Collection
>>> adheres to this, and Iterator adheres to it by returning itself. All
>>> of the other methods from Sequence remain on Iterator. Thus anyone
>>> with API that only needs a single pass would take a IteratorProvider
>>> and then work on the iterator it provides.
>>
>> That leaves us back where we are now: people will see that
>> IteratorProvider is a simple, universal protocol for both single-and
>> multi-pass sequences, write algorithm libraries that depend on
>> multi-pass-ness, and test them with the most prevalent examples, which
>> happen to be multi pass.
>
> Let me make a quick counter-argument, because I thought about it a
> bit, and I don’t think it does have the same problem (especially with
> careful/better naming).
>
> The difference is that the ONLY method on IteratorProvider is the one
> to get an iterator. There is no map, filter, sort, first, count, etc…
> just a way to get a single-pass iterator. This changes the mindset
> when using it. You are aware that you are getting a single-pass
> iterator.Maybe. What's to stop people from extending IteratorProvider?
Nothing. But that is true of any protocol. I am ok with individual's extensions. They would have to use that single method to build up from anyway, so presumably they would have to consider the single pass case in their extensions...
> True, people might try to get the iterator a second time, but we can
> make the iteratorProvider method optional (and trying to get an
> iterator from an iterator which is spent would return nil)
> and then they are forced to deal with the case where it was
> single-pass.Now you can't loop over the same array multiple times.
I must be missing something. Isn’t that the point?
I mean, your version is called “IterableOnce”. Why do you want to iterate on IterableOnce more than once? The point (at least in my mind) is to provide a common interface for things that we want to iterate over a single time. If you want to iterate multiple times, use collection’s interface where you are guaranteed multi-pass.
That said, you actually can loop multiple times for collections by getting a new iterator from the provider (which could point to the same array storage). The optional just forces you to check for the single-pass case.
I have a feeling like I am missing your true meaning here though...
Thanks,
Jon