Skip to content

Iterator.toArray does not work with iterators. #241

Open
@samwightt

Description

@samwightt

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.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions