According to MDN, an iterator is any object that implements a next method that returns an IteratorResult (Iterator.value<'a> in RescriptCore). An iterable is any object that implements the [Symbol.iterator] method that returns an iterator.
Right now Iterator.toArray is defined as an extern using Array.from:
https://github.com/rescript-association/rescript-core/blob/22642eafb6c268c8348bd68c8569a30918b66d6b/src/Core__Iterator.res#L9C1-L9C52
However, Array.from accepts an iterable, not an iterator. This means that if we implement a valid iterator (not an iterable, but an object with next), Iterator.next and Iterator.forEach will work just fine but Iterator.toArray will not: it returns an empty array.
To fix this, Iterator.toArray should be defined something like:
let toArray = (iterator: t<'a>): array<'a> => {
let results = []
iterator->forEach(value => {
switch value {
| Some(value) => Array.push(results, value)
| None => _
}
})
results
}
To use Array.from, a separate module for iterables should be defined and used instead.
According to MDN, an iterator is any object that implements a
nextmethod that returns anIteratorResult(Iterator.value<'a>inRescriptCore). An iterable is any object that implements the[Symbol.iterator]method that returns an iterator.Right now
Iterator.toArrayis defined as an extern usingArray.from:https://github.com/rescript-association/rescript-core/blob/22642eafb6c268c8348bd68c8569a30918b66d6b/src/Core__Iterator.res#L9C1-L9C52
However,
Array.fromaccepts an iterable, not an iterator. This means that if we implement a valid iterator (not an iterable, but an object withnext),Iterator.nextandIterator.forEachwill work just fine butIterator.toArraywill not: it returns an empty array.To fix this,
Iterator.toArrayshould be defined something like:To use
Array.from, a separate module for iterables should be defined and used instead.