Skip to content

Iterator.toArray does not work with iterators. #241

@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
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions