Skip to content

tc39/proposal-iterator-sequencing

Repository files navigation

Iterator Sequencing

A TC39 proposal to create iterators by sequencing existing iterators.

Stage: 2.7

Specification: https://tc39.es/proposal-iterator-sequencing/

presentations to committee

motivation

Often you have 2 or more iterators, the values of which you would like to consume in sequence, as if they were a single iterator. Iterator libraries (and standard libraries of other languages) often have a function called concat or chain to do this. In JavaScript today, one can accomplish this with generators:

let lows = Iterator.from([0, 1, 2, 3]);
let highs = Iterator.from([6, 7, 8, 9]);

let lowsAndHighs = function* () {
  yield* lows;
  yield* highs;
}();

Array.from(lowsAndHighs); // [0, 1, 2, 3, 6, 7, 8, 9]

It is also useful to be able to sequence immediate values among the iterators, as one would do with yield using the generator approach.

let digits = function* () {
  yield* lows;
  yield 4;
  yield 5;
  yield* highs;
}();

Array.from(digits); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

We should explore how to make this more ergonomic and functional.

chosen solution

let digits = Iterator.concat(lows, [4, 5], highs);

For the (rare) case of infinite iterators of iterators, use Iterator.prototype.flatMap with the identity function.

function* selfCountingSequenceHelper() {
  for (let n = 1;; ++n) {
    yield Array(n).fill(n);
  }
}
let selfCountingSequence = selfCountingSequenceHelper().flatMap(x => x)

prior art

other languages

language data type exactly 2 arbitrary
Clojure lazy seq concat
Elm List append/++ concat
Haskell Semigroup <> mconcat
OCaml Seq append concat
Python iterator chain
Ruby Enumerable chain
Rust Iterator chain flatten
Scala Iterator concat/++
Swift LazySequence joined

JS libraries

library exactly 2 arbitrary
@softwareventures/iterator prependOnce/appendOnce concatOnce
extra-iterable concat
immutable.js Seq::concat
iterablefu concatenate
itertools-ts chain
lodash flatten
ramda concat unnest
sequency plus
wu chain

About

a TC39 proposal to create iterators by sequencing existing iterators

Resources

Code of conduct

Security policy

Stars

Watchers

Forks

Contributors 3

  •  
  •  
  •  
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy