The ES6 iteration protocol
Good write up, although "fresh vs singleton" topic doesn't make sense, and doesn't reflect the spec. I responded on the gist.
Dmitry
Regardless of what the spec says, you cannot avoid singleton iterators in real-world code. In my opinion, the spec should refrain from specifying when object creation happens within the iteration protocol, wait for the relevant code and contract patterns to develop and then include something in ES7.
I guess all built-in iterators return themselves for Symbol.iterator
protocol. So they are all "singletons". I described in detail where
confusion/substitution of concepts happens in that analysis in the recent
two comments.
Dmitry
On Apr 6, 2015, at 2:23 PM, Dmitry Soshnikov <dmitry.soshnikov at gmail.com> wrote:
I guess all built-in iterators return themselves for
Symbol.iterator
protocol. So they are all "singletons". I described in detail where confusion/substitution of concepts happens in that analysis in the recent two comments.
I don’t think “singleton” is the correct term for the concept that Axel is trying to describe. A “singleton” is normally an kind of object for which there is only a single instances. There may be many instances of, for example %ArrayIterator%, so it isn’t correct to call %ArrayIterator% a singleton
What Axel is describing might be characterized as “self iterable”, it returns itself when recieving a Symbol.iterator request.
Exactly, that's what I tried to explain. Since in one case it considers just an iterable (an array), and in other case -- an iterator (which is by "coincidence" is also an iterable). But an array's iterator is an iterable as well, and also always returns itself for iterator protocol.
Yeah, the "self-iterable" makes much more sense in this case.
Dmitry
There are two different aspects:
- If you get an iterable, it sometimes matters whether iteration restarts when you ask the iterable for an iterator.
- Self-iterability is how iterators turn themselves into iterables so that constructs that work with iterables can be used. It also enables generators to play two roles: generator methods can implement
[Symbol.iterator]
and generator functions can implement iterable-returning functions.
In this particular case, I’m interested in #1. I probably have to come up with a better term for it.
Axel Rauschmayer wrote:
There are two different aspects:
- If you get an iterable, it sometimes matters whether iteration restarts when you ask the iterable for an iterator.
Rather, if you have an object o and o[Symbol.iterator]() === o
then you
have an iterator.
- Self-iterability is how iterators turn themselves into iterables so that constructs that work with iterables can be used. It also enables generators to play two roles: generator methods can implement
[Symbol.iterator]
and generator functions can implement iterable-returning functions.
I'm not clear on what 2 means. Generator functions definitely return generator-iterators when called. A generator function gf does not have a gf[Symbol.iterator] property, though.
In this particular case, I’m interested in #1. I probably have to come up with a better term for it.
Yes, "singleton" is the wrong word. Perhaps you want "iterator"? :
FWIW: I have written down my understanding of the ES6 iteration protocol (shaped by discussions I had on this mailing list).
gist.github.com/rauschma/73e5f86a595b7709f39e