# Number.range & BigInt.range

**Champions**: Jack Works

**Author**: Jack Works

**Stage**: 1

This proposal describes adding a `Number.range`

and a `BigInt.range`

to JavaScript.

See the rendered spec at here.

Compare with other languages (Work in progress)

## Polyfill

A polyfill is available in the core-js library. You can find it in the ECMAScript proposals section.

In the proposal repo is available a a step-to-step implementation of the proposal so you can verify if there is a bug in the specification by the debugger.

## 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
`Number.range(0, Infinity)`

-> (0, 1, 2, 3, ...)

### Non-goals

- New Syntax
- String Sequence (a, b, c, d, ...)
- Magic
- E.g.
`if (x in Number.range(0, 10))`

(Kotlin have this feature)

- E.g.

### Discussions

#### Discussions in Issue

##### Important semantics discussion

##### Others

- #13: Integration with Slice notation proposal
- #18: Alias Number.range(end) for Number.range(0, end)
- #19: API design (move to NumberRangeIterator, BigIntRangeIterator or Iterator.range)
- #25: Possible options

# Examples

See tests to learn about more usages.

```
for (const i of BigInt.range(0n, 43n)) console.log(i) // 0n to 42n
// With iterator helper proposal
Number.range(0, Infinity)
.take(1000)
.filter((x) => !(x % 3))
.toArray()
function* even() {
for (const i of Number.range(0, Infinity)) if (i % 2 === 0) yield i
}
;[...Number.range(1, 100, 2)] // odd number from 1 to 99
```

# Presentations

### Signature

See global.d.ts