Skip to content

tc39/proposal-iterator.range

main
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Iterator.range

Champions: Jack Works

Author: Jack Works

Stage: 2

This proposal describes adding Iterator.range to JavaScript.

See the rendered spec at here.

Compare with other languages (Work in progress)

Playground

Polyfill

Motivation

  • because we don't have it yet™

Without these functions, the language feels incomplete, and is a paper cut to what could be a very polished experience. Bringing this into the platform will improve performance of the web, and developer productivity as they no longer have to implement these common functions.

—— String.prototype.{padStart,padEnd}

range is a very useful function. For example in Python:

for i in range(5):
    # ...

At least 20 different implementations in a single stackoverflow question.

Tons of libraries providing a range: math.js, lodash, underscore.js, ramda, d3, range, fill-range, multi-integer-range, ……

Goals

  • Arithmetic Sequence
    • Incremental (0, 1, 2, 3, ...)
    • Decremental (0, -1, -2, -3, ...)
    • Step (0, 2, 4, 6, ...)
      • Decimal step (0, 0.2, 0.4, ...)
  • BigInt Support
    • Same as Arithmetic Sequence
  • Infinite Sequence Iterator.range(0, Infinity) -> (0, 1, 2, 3, ...)

Non-goals

  • New Syntax
  • String Sequence (a, b, c, d, ...)
  • Magic
    • E.g. if (x in Iterator.range(0, 10)) (Kotlin has this feature)

Examples

See tests to learn about more usages.

for (const i of Iterator.range(0n, 43n)) console.log(i) // 0n to 42n

Iterator.range(0, Infinity)
    .take(1000)
    .filter((x) => !(x % 3))
    .toArray()

function* even() {
    for (const i of Iterator.range(0, Infinity)) if (i % 2 === 0) yield i
}
;[...Iterator.range(1, 100, 2)] // odd number from 1 to 99

Presentations

Signature

See global.d.ts

About

A proposal for ECMAScript to add a built-in Iterator.range()

Resources

License

Code of conduct

Stars

Watchers

Forks