Skip to content

Iterables Reference

Coverage License NPM Version Open Issues Size

🔁 Iterable and AsyncIterable utils.

Usage

By default, all utils are meant to be used with Iterable values, to use AsyncIterable values the functions have to be imported from @lou.codes/iterables/asynchronous.

📦 Node

Install @lou.codes/iterables as a dependency:

Terminal window
1
pnpm add @lou.codes/iterables
2
# or
3
npm install @lou.codes/iterables
4
# or
5
yarn add @lou.codes/iterables

Import it and use it:

1
import { iterableToArray, map } from "@lou.codes/iterables";
2
3
const mapDouble = map((value: number) => value * 2);
4
5
iterableToArray(mapDouble([1, 2, 3])); // [2, 4, 6]

🦕 Deno

Import @lou.codes/iterables using the npm: prefix, and use it directly:

1
import { iterableToArray, map } from "npm:@lou.codes/iterables";
2
3
const mapDouble = map((value: number) => value * 2);
4
5
iterableToArray(mapDouble([1, 2, 3])); // [2, 4, 6]

🌎 Browser

Import @lou.codes/iterables using esm.sh, and use it directly:

1
<script type="module">
2
import { iterableToArray, map } from "https://esm.sh/@lou.codes/iterables";
3
4
const mapDouble = map(value => value * 2);
5
6
iterableToArray(mapDouble([1, 2, 3])); // [2, 4, 6]
7
</script>

Module: Asynchronous

Asynchronous utils (Default import).

Asynchronous Common

createIterableIterator

createIterableIterator<GeneratorFunction>(generatorFunction): GeneratorFunction extends () => IsomorphicIterator<Item> ? Readonly<GeneratorFunction<GeneratorFunction> extends (…_arguments: _Arguments) => AsyncIterator<Item, any, undefined> ? AsyncIterableIterator<Item> : IterableIterator<Item>> : never

Takes a generator function and returns an iterable iterator or asynchronous iterable iterator object.

Type parameters
NameType
GeneratorFunctionextends () => IsomorphicIterator
Parameters
NameTypeDescription
generatorFunctionGeneratorFunctionGenerator to be used every time [Symbol.iterator] is called.
Returns

GeneratorFunction extends () => IsomorphicIterator<Item> ? Readonly<GeneratorFunction<GeneratorFunction> extends (…_arguments: _Arguments) => AsyncIterator<Item, any, undefined> ? AsyncIterableIterator<Item> : IterableIterator<Item>> : never

Iterable iterator object.

Example

1
const identityGenerator = function* (value) {
2
yield value;
3
};
4
const iterableIterator = createIterableIterator(identityGenerator);
5
6
const fooIdentity = iterableIterator("foo");
7
8
for (const value of fooIdentity) {
9
console.log(value); // "foo"
10
}
11
12
// Same IterableIterator as above, return values again:
13
14
for (const value of fooIdentity) {
15
console.log(value); // "foo"
16
}

View source


forEach

forEach<Item>(callback): (iterable: IsomorphicIterable<Item>) => Promise<void>

For each function for iterables and asynchronous iterables.

Type parameters
Name
Item
Parameters
NameTypeDescription
callbackUnary<Item, Awaitable<void>>Function to be called for every item of the iterable.
Returns

fn

Curried function that expects an iterable to loop over and has callback set in context.

▸ (iterable): Promise<void>

Parameters
NameType
iterableIsomorphicIterable<Item>
Returns

Promise<void>

Example

1
const logEach = forEach(console.log);
2
3
logEach([1, 2, 3]); // Logs 1, 2 and 3 separately

View source

Asynchronous Generators

append

append<TailItem>(tailIterable): <InitialItem>(initialIterable: IsomorphicIterable<InitialItem>) => Readonly<AsyncIterableIterator<Awaited<InitialItem> | Awaited<TailItem>>>

Appends one iterable or asynchronous iterable to another.

Type parameters
Name
TailItem
Parameters
NameTypeDescription
tailIterableIsomorphicIterable<TailItem>Iterable or asynchronous to be appended.
Returns

fn

Curried generator function with tailIterable set in context.

▸ <InitialItem>(initialIterable): Readonly<AsyncIterableIterator<Awaited<InitialItem> | Awaited<TailItem>>>

Type parameters
Name
InitialItem
Parameters
NameType
initialIterableIsomorphicIterable<InitialItem>
Returns

Readonly<AsyncIterableIterator<Awaited<InitialItem> | Awaited<TailItem>>>

Example

1
const appendNumbers = append([0, 1, 2, 3, 4]);
2
3
appendNumbers(["foo", "bar"]); // ["foo", "bar", 0, 1, 2, 3, 4]
4
appendNumbers([]); // [0, 1, 2, 3, 4]

View source


drop

drop(amount): <Item>(iterable: IsomorphicIterable<Item>) => Readonly<AsyncIterableIterator<Awaited<Item>>>

Drop the specified amount of items from the given iterable or asynchronous iterable.

Parameters
NameTypeDescription
amountnumber | bigintAmount of items to drop.
Returns

fn

Curried function with amount in context.

▸ <Item>(iterable): Readonly<AsyncIterableIterator<Awaited<Item>>>

Type parameters
Name
Item
Parameters
NameType
iterableIsomorphicIterable<Item>
Returns

Readonly<AsyncIterableIterator<Awaited<Item>>>

Example

1
const drop2 = drop(2);
2
drop2([1, 2, 3, 4, 5]); // [3, 4, 5]

View source


filter

filter<Item, Filtered>(predicate): (iterable: IsomorphicIterable<Item>) => Readonly<AsyncIterableIterator<Awaited<Filtered>>>

Filters items in an iterable or asynchronous iterable against a predicate and returns items that evaluated to true.

Type parameters
NameType
ItemItem
Filterednever
Parameters
NameTypeDescription
predicateSingle<Filtered> extends Single<never> ? Unary<Item, boolean> : Predicate<Item, Filtered>Predicate function to evaluate each item.
Returns

fn

Curried function with predicate set in context.

▸ (iterable): Readonly<AsyncIterableIterator<Awaited<Filtered>>>

Parameters
NameType
iterableIsomorphicIterable<Item>
Returns

Readonly<AsyncIterableIterator<Awaited<Filtered>>>

Example

1
const filterEven = filter((number: number) => number % 2 === 0);
2
3
iterableToArray(filterEven([1, 2, 3, 4])); // [2, 4]
4
iterableToArray(filterEven([1, 3, 5, 7])); // []

View source


flat

flat<Iterable>(iterable): Iterable extends IsomorphicIterable<Item> ? Readonly<Item extends IsomorphicIterable<SubItem> ? AsyncIterableIterator<SubItem> : AsyncIterableIterator<Item>> : never

Flattens one level of the given iterable or asynchronous iterable.

Type parameters
NameType
Iterableextends IsomorphicIterable
Parameters
NameTypeDescription
iterableIterableIterable to flatten.
Returns

Iterable extends IsomorphicIterable<Item> ? Readonly<Item extends IsomorphicIterable<SubItem> ? AsyncIterableIterator<SubItem> : AsyncIterableIterator<Item>> : never

Iterable with flatten items.

Example

1
flat([1, 2, [3, 4]]); // [1, 2, 3, 4]

View source


initial

initial<Iterable>(iterable): IsomorphicIterableIterator<IsomorphicIterableItem<Iterable>>

Get all elements except the last one of an iterable or asynchronous iterable.

Type parameters
NameType
Iterableextends IsomorphicIterable
Parameters
NameTypeDescription
iterableIterableIterable to get the items from.
Returns

IsomorphicIterableIterator<IsomorphicIterableItem<Iterable>>

Iterable with all items except the last one.

Example

1
initial([1, 2, 3]); // [1, 2]

View source


intersperse

intersperse<Separator>(separator): <Item>(iterable: IsomorphicIterable<Item>) => IsomorphicIterableIterator<Item | Awaited<Separator> | Awaited<Item>>

Add the given separator between each element of the given iterable or asynchronous iterable.

Type parameters
Name
Separator
Parameters
NameTypeDescription
separatorSeparatorSeparator to add between each element.
Returns

fn

Curried function with separator in context.

▸ <Item>(iterable): IsomorphicIterableIterator<Item | Awaited<Separator> | Awaited<Item>>

Type parameters
Name
Item
Parameters
NameType
iterableIsomorphicIterable<Item>
Returns

IsomorphicIterableIterator<Item | Awaited<Separator> | Awaited<Item>>

Example

1
const intersperseComma = intersperse(",");
2
intersperseComma([1, 2, 3]); // [1, ",", 2, ",", 3]

View source


map

map<Item, MappedItem>(mapper): (iterable: IsomorphicIterable<Item>) => Readonly<AsyncIterableIterator<Awaited<MappedItem>>>

Map for iterables and asynchronous iterables.

Type parameters
Name
Item
MappedItem
Parameters
NameTypeDescription
mapperUnary<Item, MappedItem>Mapper function.
Returns

fn

Generator function with mapper function set in context.

▸ (iterable): Readonly<AsyncIterableIterator<Awaited<MappedItem>>>

Parameters
NameType
iterableIsomorphicIterable<Item>
Returns

Readonly<AsyncIterableIterator<Awaited<MappedItem>>>

Example

1
const double = value => value * 2;
2
const mapDouble = map(double);
3
4
mapDouble([1, 2, 3]); // [2, 4, 6]

View source


objectToEntries

objectToEntries<Key, Value>(input): Readonly<AsyncIterableIterator<Entry<Key, Value>>>

Yields all entries of an object (including symbols).

Type parameters
NameType
Keyextends PropertyKey
ValueValue
Parameters
NameTypeDescription
inputReadonly<Record<Key, Value>>Object to get entries from.
Returns

Readonly<AsyncIterableIterator<Entry<Key, Value>>>

Iterable with entries of the given object (including symbols).

Example

1
const entries = objectEntries({ a: 1, b: 2 });
2
entries.next(); // { value: ["a", 1], done: false }
3
entries.next(); // { value: ["b", 2], done: false }
4
entries.next(); // { value: undefined, done: true }

View source


prepend

prepend<InitialItem>(initialIterable): <TailItem>(tailIterable: IsomorphicIterable<TailItem>) => Readonly<AsyncIterableIterator<Awaited<InitialItem> | Awaited<TailItem>>>

Prepends one iterable or asynchronous iterable to another.

Type parameters
Name
InitialItem
Parameters
NameTypeDescription
initialIterableIsomorphicIterable<InitialItem>Iterable or asynchronous iterable to be appended.
Returns

fn

Curried generator function with initialIterable set in context.

▸ <TailItem>(tailIterable): Readonly<AsyncIterableIterator<Awaited<InitialItem> | Awaited<TailItem>>>

Type parameters
Name
TailItem
Parameters
NameType
tailIterableIsomorphicIterable<TailItem>
Returns

Readonly<AsyncIterableIterator<Awaited<InitialItem> | Awaited<TailItem>>>

Example

1
const prependNumbers = prepend([0, 1, 2, 3, 4]);
2
prependNumbers(["foo", "bar"]); // [0, 1, 2, 3, 4, "foo", "bar"]

View source


random

random(seed): (from: number) => (to: number) => Readonly<AsyncIterableIterator<number>>

Deterministic pseudo-random number generator.

⚠️ IMPORTANT: This only works in secure contexts (HTTPS/Node).

Parameters
NameTypeDescription
seedstring | NumericSeed to be used to generate random numbers.
Returns

fn

Curried generator function with seed set in context.

▸ (from): (to: number) => Readonly<AsyncIterableIterator<number>>

Parameters
NameType
fromnumber
Returns

fn

▸ (to): Readonly<AsyncIterableIterator<number>>

Parameters
NameType
tonumber
Returns

Readonly<AsyncIterableIterator<number>>

Example

1
const seededRandom = random("some seed");
2
const random0To10 = seededRandom(0)(10);
3
4
[...pick(2)(random0To10)]; // Two "random" values between 0 and 10
5
[...pick(2)(random0To10)]; // Same two "random" values between 0 and 10

See

View source


range

range<Step>(step): (from: Step extends bigint ? bigint : number) => (to: Step extends bigint ? bigint : number) => Readonly<AsyncIterableIterator<number | Step extends bigint ? bigint : number>>

Range iterable generator (from from to to).

Type parameters
NameType
Stepextends number | bigint
Parameters
NameTypeDescription
stepStepStep size.
Returns

fn

Curried function with step set in context.

▸ (from): (to: Step extends bigint ? bigint : number) => Readonly<AsyncIterableIterator<number | Step extends bigint ? bigint : number>>

Parameters
NameType
fromStep extends bigint ? bigint : number
Returns

fn

▸ (to): Readonly<AsyncIterableIterator<number | Step extends bigint ? bigint : number>>

Parameters
NameType
toStep extends bigint ? bigint : number
Returns

Readonly<AsyncIterableIterator<number | Step extends bigint ? bigint : number>>

Example

1
[...range(1)(0)(5)]; // [0, 1, 2, 3, 4, 5]
2
[...range(1)(5)(0)]; // [5, 4, 3, 2, 1, 0]

View source


repeat

repeat(times): <Item>(item: Item) => Readonly<AsyncIterableIterator<Awaited<Item>>>

Repeat given item the specified amount of times (can be BigInt or Infinity times) as an iterable.

Parameters
NameType
timesnumber | bigint
Returns

fn

Curried function with item in context.

▸ <Item>(item): Readonly<AsyncIterableIterator<Awaited<Item>>>

Type parameters
Name
Item
Parameters
NameType
itemItem
Returns

Readonly<AsyncIterableIterator<Awaited<Item>>>

Example

1
const repeat3Times = repeat(3);
2
repeat3Times("foo"); // ["foo", "foo", "foo"]

View source


take

take(amount): <Item>(iterable: IsomorphicIterable<Item>) => Readonly<AsyncIterableIterator<Awaited<Item>>>

Take the given amount of items from the iterable or asynchronous iterable.

Parameters
NameTypeDescription
amountnumber | bigintAmount of items to take.
Returns

fn

Curried function with amount in context.

▸ <Item>(iterable): Readonly<AsyncIterableIterator<Awaited<Item>>>

Type parameters
Name
Item
Parameters
NameType
iterableIsomorphicIterable<Item>
Returns

Readonly<AsyncIterableIterator<Awaited<Item>>>

Example

1
const take2 = take(2);
2
take2([1, 2, 3, 4, 5]); // [1, 2]

View source


toIterable

toIterable<ValueOrAsyncIterable>(valueOrIterable): Readonly<AsyncIterableIterator<ValueOrAsyncIterable extends IsomorphicIterable ? IsomorphicIterableItem<ValueOrAsyncIterable<ValueOrAsyncIterable>> : ValueOrAsyncIterable>>

Takes a value, iterable or asynchronous iterable and yields it.

Type parameters
Name
ValueOrAsyncIterable
Parameters
NameTypeDescription
valueOrIterableValueOrAsyncIterableVale or iterable to yield.
Returns

Readonly<AsyncIterableIterator<ValueOrAsyncIterable extends IsomorphicIterable ? IsomorphicIterableItem<ValueOrAsyncIterable<ValueOrAsyncIterable>> : ValueOrAsyncIterable>>

Yielded item or iterable.

Example

1
const iterable = toIterable(1);
2
const iterator = getIterator(iterable);
3
iterator.next(); // { value: 1, done: false }
4
iterator.next(); // { value: undefined, done: true }

See

createIterableIterator

View source


unique

unique<Item>(iterable): Readonly<AsyncIterableIterator<Awaited<Item>>>

Returns a single instance of each item in the iterable or asynchronous iterable.

Type parameters
Name
Item
Parameters
NameTypeDescription
iterableIsomorphicIterable<Item>Iterable to be filtered.
Returns

Readonly<AsyncIterableIterator<Awaited<Item>>>

Generators with a single instance of each item of the iterable.

Example

1
unique([1, 2, 3, 4, 1, 2, 3, 4]); // [1, 2, 3, 4]

View source


zip

zip<ItemFirst>(iterableFirst): <ItemSecond>(iterableSecond: IsomorphicIterable<ItemSecond>) => Readonly<AsyncIterableIterator<readonly [ItemFirst | Awaited<ItemFirst>, ItemSecond]>>

Takes two iterables or asynchronous iterable and returns a new iterable or asynchronous iterable with the length of the shortest iterable with tuples containing the items from both.

Type parameters
Name
ItemFirst
Parameters
NameTypeDescription
iterableFirstIsomorphicIterable<ItemFirst>One of the iterables to be zipped.
Returns

fn

Curried function with iterableFirst in context.

▸ <ItemSecond>(iterableSecond): Readonly<AsyncIterableIterator<readonly [ItemFirst | Awaited<ItemFirst>, ItemSecond]>>

Type parameters
Name
ItemSecond
Parameters
NameType
iterableSecondIsomorphicIterable<ItemSecond>
Returns

Readonly<AsyncIterableIterator<readonly [ItemFirst | Awaited<ItemFirst>, ItemSecond]>>

Example

1
const zipNumbers = zip([0, 1, 2]);
2
zipNumbers([3, 4, 5]); // [[0, 3], [1, 4], [2, 5]]

View source


zipIndex

zipIndex<ItemSecond>(iterableSecond): Readonly<AsyncIterableIterator<readonly [number, ItemSecond]>>

Yields a tuple for each item in the iterable with the index of said item.

Type parameters
Name
ItemSecond
Parameters
NameType
iterableSecondIsomorphicIterable<ItemSecond>
Returns

Readonly<AsyncIterableIterator<readonly [number, ItemSecond]>>

Example

1
zipIndex(["foo", "bar"]); // [[0, "foo"], [1, "bar"]]

Yields

Tuples with the index of each item.

View source

Asynchronous Reducers

count

count<Item>(predicate): (iterable: IsomorphicIterable<Item>) => Promise<number>

Counts the number of items that satisfy a predicate in the given iterable or asynchronous iterable.

Type parameters
Name
Item
Parameters
NameTypeDescription
predicateFilter<Item>Predicate function for items to be counted.
Returns

fn

Curried function with predicate in context.

▸ (iterable): Promise<number>

Parameters
NameType
iterableIsomorphicIterable<Item>
Returns

Promise<number>

Example

1
const countOdds = count((number: number) => number % 2 !== 1);
2
countOdds([1, 2, 3, 4, 5]); // 3
3
countOdds([0, 2, 4, 6, 8]); // 0

View source


entriesToObject

entriesToObject<Item>(iterable): Promise<Readonly<Record<EntryKey<Item>, EntryValue<Item>>>>

Takes an entries iterable or asynchronous iterable and returns an object.

Type parameters
NameType
Itemextends Entry
Parameters
NameType
iterableIsomorphicIterable<Item>
Returns

Promise<Readonly<Record<EntryKey<Item>, EntryValue<Item>>>>

Object constructed from entries.

Example

1
entriesToObject([["key", "value"]]); // { key: "value" }
2
entriesToObject([
3
["foo", "bar"],
4
["number", 1],
5
]); // { foo: "bar", number: 1 }

View source


every

every<Item, Predicated>(predicate): (iterable: IsomorphicIterable<Item>) => Promise<boolean>

Evaluates items in an iterable or asynchronous iterable against a predicate and returns true if all items evaluates to true.

Type parameters
NameType
ItemItem
Predicatednever
Parameters
NameTypeDescription
predicateSingle<Predicated> extends Single<never> ? Unary<Item, boolean> : Predicate<Item, Predicated>Predicate function to evaluate each item.
Returns

fn

Curried function with predicate set in context.

▸ (iterable): Promise<boolean>

Parameters
NameType
iterableIsomorphicIterable<Item>
Returns

Promise<boolean>

Example

1
const everyEven = every((number: number) => number % 2 === 0);
2
everyEven([2, 4, 6, 8]); // true
3
everyEven([1, 2, 3, 4]); // false

View source


find

find<Item>(predicate): (iterable: IsomorphicIterable<Item>) => Promise<Maybe<Item>>

Returns the value of the first item in the iterable or asynchronous iterable where predicate is true, undefined otherwise.

Type parameters
Name
Item
Parameters
NameTypeDescription
predicateUnary<Item, boolean>Predicate function to search for item.
Returns

fn

Curried function with predicate set in context.

▸ (iterable): Promise<Maybe<Item>>

Parameters
NameType
iterableIsomorphicIterable<Item>
Returns

Promise<Maybe<Item>>

Example

1
const findEven = find((number: number) => number % 2 === 0);
2
findEven([1, 2, 3, 4]); // 2
3
findEven([1, 3, 5, 7]); // undefined

View source


groupBy

groupBy<Item, Key>(grouper): <Iterable>(iterable: Iterable) => Iterable extends AsyncIterable<unknown> ? Promise<Readonly<Record<Key, ReadOnlyArray<Item>>>> : Readonly<Record<Key, ReadOnlyArray<Item>>>

Groups values of an iterable or asynchronous iterable in an object based on the output of the grouper function.

Type parameters
NameType
ItemItem
Keyextends PropertyKey
Parameters
NameTypeDescription
grouperUnary<Item, Key>Grouper function.
Returns

fn

Object with grouped values.

▸ <Iterable>(iterable): Iterable extends AsyncIterable<unknown> ? Promise<Readonly<Record<Key, ReadOnlyArray<Item>>>> : Readonly<Record<Key, ReadOnlyArray<Item>>>

Type parameters
NameType
Iterableextends IsomorphicIterable<Item>
Parameters
NameType
iterableIterable
Returns

Iterable extends AsyncIterable<unknown> ? Promise<Readonly<Record<Key, ReadOnlyArray<Item>>>> : Readonly<Record<Key, ReadOnlyArray<Item>>>

Example

1
const groupByType = groupBy((value: number) =>
2
number % 2 === 0 ? "even" : "odd",
3
);
4
groupByType([1, 2, 3, 4, 5]); // { even: [2, 4], odd: [1, 3, 5] }

View source


head<Iterable>(iterable): Iterable extends ReadOnlyArray ? Head<Iterable<Iterable>> : Maybe<IsomorphicIterableItem<Iterable>>

Get first element of an iterable or asynchronous iterable (undefined if it is empty).

Type parameters
NameType
Iterableextends IsomorphicIterable
Parameters
NameTypeDescription
iterableIterableIterable to get the first element from.
Returns

Iterable extends ReadOnlyArray ? Head<Iterable<Iterable>> : Maybe<IsomorphicIterableItem<Iterable>>

First element of the iterable (undefined if empty).

Example

1
head([1, 2, 3]); // 1

View source


includes

includes<SearchItem>(searchItem): (iterable: IsomorphicIterable<unknown>) => Promise<boolean>

Tries to find the given searchItem in iterable or asynchronous iterable.

Type parameters
Name
SearchItem
Parameters
NameTypeDescription
searchItemSearchItemItem to search.
Returns

fn

Curried function with searchItem set in context.

▸ (iterable): Promise<boolean>

Parameters
NameType
iterableIsomorphicIterable<unknown>
Returns

Promise<boolean>

Example

1
const includesTwo = includes(2);
2
includesTwo([1, 2, 3, 4]); // true
3
includesTwo([1, 3, 5, 7]); // false

View source


iterableToArray

iterableToArray<Iterable>(iterable): Promise<ReadOnlyArray<IsomorphicIterableItem<Iterable>>>

Turns given iterable or asynchronous iterable into an array.

Type parameters
NameType
Iterableextends IsomorphicIterable
Parameters
NameTypeDescription
iterableIterableIterable to be turned into an array.
Returns

Promise<ReadOnlyArray<IsomorphicIterableItem<Iterable>>>

Array made of iterable items.

Example

1
iterableToArray([1, 2, 3, 4]); // [1, 2, 3, 4]

View source


join

join(separator): <Iterable>(iterable: Iterable) => Iterable extends AsyncIterable<unknown> ? Promise<string> : string

Takes a separator string and a iterable or asynchronous iterable and returns a string with the concatenation of all the elements separated by the separator.

Parameters
NameTypeDescription
separatorstringString to use as separator.
Returns

fn

Curried function with separator in context.

▸ <Iterable>(iterable): Iterable extends AsyncIterable<unknown> ? Promise<string> : string

Type parameters
NameType
Iterableextends IsomorphicIterable
Parameters
NameType
iterableIterable
Returns

Iterable extends AsyncIterable<unknown> ? Promise<string> : string

Example

1
const joinWithSpaces = join(" ");
2
joinWithSpaces([1, 2, 3]); // "1 2 3"

View source


length

length<Iterable>(iterable): Iterable extends AsyncIterable<unknown> ? Promise<number> : number

Get the length of an iterable or asynchronous iterable.

Type parameters
NameType
Iterableextends IsomorphicIterable<unknown>
Parameters
NameTypeDescription
iterableIterableIterable or asynchronous iterable to get the length from.
Returns

Iterable extends AsyncIterable<unknown> ? Promise<number> : number

Promise with the length of the iterable.

Example

1
length([1, 2, 3]); // 3

View source


reduce

reduce<Item, Accumulator>(reducer): (initialValue: Accumulator) => <Iterable>(iterable: Iterable) => Iterable extends AsyncIterable<unknown> ? Promise<Accumulator> : Accumulator

Reducer function for iterables and asynchronous iterables.

Type parameters
Name
Item
Accumulator
Parameters
NameTypeDescription
reducerUnary<Item, Unary<Accumulator, Awaitable<Accumulator>>>Reducer function.
Returns

fn

Curried function with reducer in context.

▸ (initialValue): <Iterable>(iterable: Iterable) => Iterable extends AsyncIterable<unknown> ? Promise<Accumulator> : Accumulator

Parameters
NameType
initialValueAccumulator
Returns

fn

▸ <Iterable>(iterable): Iterable extends AsyncIterable<unknown> ? Promise<Accumulator> : Accumulator

Type parameters
NameType
Iterableextends IsomorphicIterable<Item>
Parameters
NameType
iterableIterable
Returns

Iterable extends AsyncIterable<unknown> ? Promise<Accumulator> : Accumulator

Example

1
const sum = Accumulator<number>(item => total => total + item);
2
const sumFrom0 = sum(0);
3
4
sumFrom0([1, 2, 3]); // 6

View source


some

some<Item, Predicated>(predicate): (iterable: IsomorphicIterable<Item>) => Promise<boolean>

Evaluates items in an iterable or asynchronous iterable against a predicate and returns true if any item evaluates to true.

Type parameters
NameType
ItemItem
Predicatednever
Parameters
NameTypeDescription
predicateSingle<Predicated> extends Single<never> ? Unary<Item, boolean> : Predicate<Item, Predicated>Predicate function to evaluate each item.
Returns

fn

Curried function with predicate set in context.

▸ (iterable): Promise<boolean>

Parameters
NameType
iterableIsomorphicIterable<Item>
Returns

Promise<boolean>

Example

1
const someEven = some((number: number) => number % 2 === 0);
2
someEven([1, 2, 3, 4]); // true
3
someEven([1, 3, 5, 7]); // false

View source

Module: Synchronous

Synchronous utils (Default import).

Common

createIterableIterator

createIterableIterator<Item>(generatorFunction): Readonly<IterableIterator<Item>>

Takes a generator function and returns an iterable iterator object.

Type parameters
Name
Item
Parameters
NameTypeDescription
generatorFunction() => Readonly<Iterator<Item, void, void>>Generator to be used every time [Symbol.iterator] is called.
Returns

Readonly<IterableIterator<Item>>

Iterable iterator object.

Example

1
const identityGenerator = function* (value) {
2
yield value;
3
};
4
const iterableIterator = createIterableIterator(identityGenerator);
5
6
const fooIdentity = iterableIterator("foo");
7
8
for (const value of fooIdentity) {
9
console.log(value); // "foo"
10
}
11
12
// Same IterableIterator as above, return values again:
13
14
for (const value of fooIdentity) {
15
console.log(value); // "foo"
16
}

View source


forEach

forEach<Item>(callback): (iterable: Readonly<Iterable<Item>>) => void

For each function for iterables.

Type parameters
Name
Item
Parameters
NameTypeDescription
callbackUnary<Item, void>Function to be called for every item of the iterable.
Returns

fn

Curried function that expects an iterable to loop over and has callback set in context.

▸ (iterable): void

Parameters
NameType
iterableReadonly<Iterable<Item>>
Returns

void

Example

1
const logEach = forEach(console.log);
2
3
logEach([1, 2, 3]); // Logs 1, 2 and 3 separately

View source

Generators

append

append<TailItem>(tailIterable): <InitialItem>(initialIterable: Readonly<Iterable<InitialItem>>) => Readonly<IterableIterator<TailItem | InitialItem>>

Appends one iterable to another.

Type parameters
Name
TailItem
Parameters
NameTypeDescription
tailIterableReadonly<Iterable<TailItem>>Iterable to be appended.
Returns

fn

Curried generator function with tailIterable set in context.

▸ <InitialItem>(initialIterable): Readonly<IterableIterator<TailItem | InitialItem>>

Type parameters
Name
InitialItem
Parameters
NameType
initialIterableReadonly<Iterable<InitialItem>>
Returns

Readonly<IterableIterator<TailItem | InitialItem>>

Example

1
const appendNumbers = append([0, 1, 2, 3, 4]);
2
3
appendNumbers(["foo", "bar"]); // ["foo", "bar", 0, 1, 2, 3, 4]
4
appendNumbers([]); // [0, 1, 2, 3, 4]

View source


drop

drop(amount): <Item>(iterable: Readonly<Iterable<Item>>) => Readonly<IterableIterator<Item>>

Drop the specified amount of items from the given iterable.

Parameters
NameTypeDescription
amountnumber | bigintAmount of items to drop.
Returns

fn

Curried function with amount in context.

▸ <Item>(iterable): Readonly<IterableIterator<Item>>

Type parameters
Name
Item
Parameters
NameType
iterableReadonly<Iterable<Item>>
Returns

Readonly<IterableIterator<Item>>

Example

1
const drop2 = drop(2);
2
drop2([1, 2, 3, 4, 5]); // [3, 4, 5]

View source


filter

filter<Item, Filtered>(predicate): (iterable: Readonly<Iterable<Item>>) => Readonly<IterableIterator<Filtered>>

Filters items in an iterable against a predicate and returns items that evaluated to true.

Type parameters
NameType
ItemItem
Filterednever
Parameters
NameTypeDescription
predicateSingle<Filtered> extends Single<never> ? Unary<Item, boolean> : Predicate<Item, Filtered>Predicate function to evaluate each item.
Returns

fn

Curried function with predicate set in context.

▸ (iterable): Readonly<IterableIterator<Filtered>>

Parameters
NameType
iterableReadonly<Iterable<Item>>
Returns

Readonly<IterableIterator<Filtered>>

Example

1
const filterEven = filter((number: number) => number % 2 === 0);
2
3
iterableToArray(filterEven([1, 2, 3, 4])); // [2, 4]
4
iterableToArray(filterEven([1, 3, 5, 7])); // []

View source


flat

flat<Iterable>(iterable): Iterable extends Readonly<Iterable<Item>> ? Item extends Readonly<Iterable<SubItem>> ? Readonly<IterableIterator<SubItem>> : Readonly<IterableIterator<Item>> : never

Flattens one level of the given iterable.

Type parameters
NameType
Iterableextends Readonly<Iterable<unknown>>
Parameters
NameTypeDescription
iterableIterableIterable to flatten.
Returns

Iterable extends Readonly<Iterable<Item>> ? Item extends Readonly<Iterable<SubItem>> ? Readonly<IterableIterator<SubItem>> : Readonly<IterableIterator<Item>> : never

Iterable with flatten items.

Example

1
flat([1, 2, [3, 4]]); // [1, 2, 3, 4]

View source


initial

initial<Iterable>(iterable): Readonly<IterableIterator<Iterable extends ReadOnlyArray ? Initial<Iterable<Iterable>>[number] : IsomorphicIterableItem<Iterable>>>

Get all elements except the last one of an iterable.

Type parameters
NameType
Iterableextends Readonly<Iterable<unknown>>
Parameters
NameTypeDescription
iterableIterableIterable to get the items from.
Returns

Readonly<IterableIterator<Iterable extends ReadOnlyArray ? Initial<Iterable<Iterable>>[number] : IsomorphicIterableItem<Iterable>>>

Iterable with all items except the last one.

Example

1
initial([1, 2, 3]); // [1, 2]

View source


intersperse

intersperse<Separator>(separator): <Item>(iterable: Readonly<Iterable<Item>>) => Readonly<IterableIterator<Separator | Item>>

Add the given separator between each element of the given iterable.

Type parameters
Name
Separator
Parameters
NameTypeDescription
separatorSeparatorSeparator to add between each element.
Returns

fn

Curried function with separator in context.

▸ <Item>(iterable): Readonly<IterableIterator<Separator | Item>>

Type parameters
Name
Item
Parameters
NameType
iterableReadonly<Iterable<Item>>
Returns

Readonly<IterableIterator<Separator | Item>>

Example

1
const intersperseComma = intersperse(",");
2
intersperseComma([1, 2, 3]); // [1, ",", 2, ",", 3]

View source


map

map<Item, MappedItem>(mapper): (iterable: Readonly<Iterable<Item>>) => Readonly<IterableIterator<MappedItem>>

Map for iterables.

Type parameters
Name
Item
MappedItem
Parameters
NameTypeDescription
mapperUnary<Item, MappedItem>Mapper function.
Returns

fn

Generator function with mapper function set in context.

▸ (iterable): Readonly<IterableIterator<MappedItem>>

Parameters
NameType
iterableReadonly<Iterable<Item>>
Returns

Readonly<IterableIterator<MappedItem>>

Example

1
const double = value => value * 2;
2
const mapDouble = map(double);
3
4
mapDouble([1, 2, 3]); // [2, 4, 6]

View source


objectToEntries

objectToEntries<Key, Value>(input): Readonly<IterableIterator<Entry<Key, Value>>>

Yields all entries of an object (including symbols).

Type parameters
NameType
Keyextends PropertyKey
ValueValue
Parameters
NameTypeDescription
inputReadonly<Record<Key, Value>>Object to get entries from.
Returns

Readonly<IterableIterator<Entry<Key, Value>>>

Iterable with entries of the given object (including symbols).

Example

1
const entries = objectEntries({ a: 1, b: 2 });
2
entries.next(); // { value: ["a", 1], done: false }
3
entries.next(); // { value: ["b", 2], done: false }
4
entries.next(); // { value: undefined, done: true }

View source


prepend

prepend<InitialItem>(initialIterable): <TailItem>(tailIterable: Readonly<Iterable<TailItem>>) => Readonly<IterableIterator<InitialItem | TailItem>>

Prepends one iterable to another.

Type parameters
Name
InitialItem
Parameters
NameTypeDescription
initialIterableReadonly<Iterable<InitialItem>>Iterable to be appended.
Returns

fn

Curried generator function with initialIterable set in context.

▸ <TailItem>(tailIterable): Readonly<IterableIterator<InitialItem | TailItem>>

Type parameters
Name
TailItem
Parameters
NameType
tailIterableReadonly<Iterable<TailItem>>
Returns

Readonly<IterableIterator<InitialItem | TailItem>>

Example

1
const prependNumbers = prepend([0, 1, 2, 3, 4]);
2
prependNumbers(["foo", "bar"]); // [0, 1, 2, 3, 4, "foo", "bar"]

View source


range

range<Step>(step): (from: Step extends bigint ? bigint : number) => (to: Step extends bigint ? bigint : number) => Readonly<IterableIterator<number | Step extends bigint ? bigint : number>>

Range iterable generator (from from to to).

Type parameters
NameType
Stepextends number | bigint
Parameters
NameTypeDescription
stepStepStep size.
Returns

fn

Curried function with step set in context.

▸ (from): (to: Step extends bigint ? bigint : number) => Readonly<IterableIterator<number | Step extends bigint ? bigint : number>>

Parameters
NameType
fromStep extends bigint ? bigint : number
Returns

fn

▸ (to): Readonly<IterableIterator<number | Step extends bigint ? bigint : number>>

Parameters
NameType
toStep extends bigint ? bigint : number
Returns

Readonly<IterableIterator<number | Step extends bigint ? bigint : number>>

Example

1
[...range(1)(0)(5)]; // [0, 1, 2, 3, 4, 5]
2
[...range(1)(5)(0)]; // [5, 4, 3, 2, 1, 0]

View source


repeat

repeat(times): <Item>(item: Item) => Readonly<IterableIterator<Item>>

Repeat given item the specified amount of times (can be BigInt or Infinity times) as an iterable.

Parameters
NameType
timesnumber | bigint
Returns

fn

Curried function with item in context.

▸ <Item>(item): Readonly<IterableIterator<Item>>

Type parameters
Name
Item
Parameters
NameType
itemItem
Returns

Readonly<IterableIterator<Item>>

Example

1
const repeat3Times = repeat(3);
2
repeat3Times("foo"); // ["foo", "foo", "foo"]

View source


take

take(amount): <Item>(iterable: Readonly<Iterable<Item>>) => Readonly<IterableIterator<Item>>

Take the given amount of items from the iterable.

Parameters
NameTypeDescription
amountnumber | bigintAmount of items to take.
Returns

fn

Curried function with amount in context.

▸ <Item>(iterable): Readonly<IterableIterator<Item>>

Type parameters
Name
Item
Parameters
NameType
iterableReadonly<Iterable<Item>>
Returns

Readonly<IterableIterator<Item>>

Example

1
const take2 = take(2);
2
take2([1, 2, 3, 4, 5]); // [1, 2]

View source


toIterable

toIterable<ValueOrIterable>(valueOrIterable): Readonly<IterableIterator<ValueOrIterable extends IsomorphicIterable ? IsomorphicIterableItem<ValueOrIterable<ValueOrIterable>> : ValueOrIterable>>

Takes a value, iterable and yields it.

Type parameters
NameDescription
ValueOrIterableGeneric of value or iterable to yield.
Parameters
NameTypeDescription
valueOrIterableValueOrIterableVale or iterable to yield.
Returns

Readonly<IterableIterator<ValueOrIterable extends IsomorphicIterable ? IsomorphicIterableItem<ValueOrIterable<ValueOrIterable>> : ValueOrIterable>>

Yielded item or iterable.

Example

1
const iterable = toIterable(1);
2
const iterator = getIterator(iterable);
3
iterator.next(); // { value: 1, done: false }
4
iterator.next(); // { value: undefined, done: true }

See

createIterableIterator

View source


unique

unique<Item>(iterable): Readonly<IterableIterator<Item>>

Returns a single instance of each item in the iterable.

Type parameters
Name
Item
Parameters
NameTypeDescription
iterableReadonly<Iterable<Item>>Iterable to be filtered.
Returns

Readonly<IterableIterator<Item>>

Generators with a single instance of each item of the iterable.

Example

1
unique([1, 2, 3, 4, 1, 2, 3, 4]); // [1, 2, 3, 4]

View source


zip

zip<ItemFirst>(iterableFirst): <ItemSecond>(iterableSecond: Readonly<Iterable<ItemSecond>>) => Readonly<IterableIterator<readonly [ItemFirst, ItemSecond]>>

Takes two iterables and returns a new iterable with the length of the shortest iterable with tuples containing the items from both.

Type parameters
Name
ItemFirst
Parameters
NameTypeDescription
iterableFirstReadonly<Iterable<ItemFirst>>One of the iterables to be zipped.
Returns

fn

Curried function with iterableFirst in context.

▸ <ItemSecond>(iterableSecond): Readonly<IterableIterator<readonly [ItemFirst, ItemSecond]>>

Type parameters
Name
ItemSecond
Parameters
NameType
iterableSecondReadonly<Iterable<ItemSecond>>
Returns

Readonly<IterableIterator<readonly [ItemFirst, ItemSecond]>>

Example

1
const zipNumbers = zip([0, 1, 2]);
2
zipNumbers([3, 4, 5]); // [[0, 3], [1, 4], [2, 5]]

View source


zipIndex

zipIndex<ItemSecond>(iterableSecond): Readonly<IterableIterator<readonly [number, ItemSecond]>>

Yields a tuple for each item in the iterable with the index of said item.

Type parameters
Name
ItemSecond
Parameters
NameType
iterableSecondReadonly<Iterable<ItemSecond>>
Returns

Readonly<IterableIterator<readonly [number, ItemSecond]>>

Example

1
zipIndex(["foo", "bar"]); // [[0, "foo"], [1, "bar"]]

Yields

Tuples with the index of each item.

View source

Reducers

count

count<Item>(predicate): (iterable: Readonly<Iterable<Item>>) => number

Counts the number of items that satisfy a predicate in the given iterable.

Type parameters
Name
Item
Parameters
NameTypeDescription
predicateFilter<Item>Predicate function for items to be counted.
Returns

fn

Curried function with predicate in context.

▸ (iterable): number

Parameters
NameType
iterableReadonly<Iterable<Item>>
Returns

number

Example

1
const countOdds = count((number: number) => number % 2 !== 1);
2
countOdds([1, 2, 3, 4, 5]); // 3
3
countOdds([0, 2, 4, 6, 8]); // 0

View source


entriesToObject

entriesToObject<Item>(iterable): Readonly<Record<EntryKey<Item>, EntryValue<Item>>>

Takes an entries iterable and returns an object.

Type parameters
NameType
Itemextends Entry
Parameters
NameType
iterableReadonly<Iterable<Item>>
Returns

Readonly<Record<EntryKey<Item>, EntryValue<Item>>>

Object constructed from entries.

Example

1
entriesToObject([["key", "value"]]); // { key: "value" }
2
entriesToObject([
3
["foo", "bar"],
4
["number", 1],
5
]); // { foo: "bar", number: 1 }

View source


every

every<Item, Predicated>(predicate): (iterable: Readonly<Iterable<Item>>) => boolean

Evaluates items in an iterable against a predicate and returns true if all items evaluates to true.

Type parameters
NameType
ItemItem
Predicatednever
Parameters
NameTypeDescription
predicateSingle<Predicated> extends Single<never> ? Unary<Item, boolean> : Predicate<Item, Predicated>Predicate function to evaluate each item.
Returns

fn

Curried function with predicate set in context.

▸ (iterable): boolean

Parameters
NameType
iterableReadonly<Iterable<Item>>
Returns

boolean

Example

1
const everyEven = every((number: number) => number % 2 === 0);
2
everyEven([2, 4, 6, 8]); // true
3
everyEven([1, 2, 3, 4]); // false

View source


find

find<Item>(predicate): (iterable: Readonly<Iterable<Item>>) => Maybe<Item>

Returns the value of the first item in the iterable where predicate is true, undefined otherwise.

Type parameters
Name
Item
Parameters
NameTypeDescription
predicateUnary<Item, boolean>Predicate function to search for item.
Returns

fn

Curried function with predicate set in context.

▸ (iterable): Maybe<Item>

Parameters
NameType
iterableReadonly<Iterable<Item>>
Returns

Maybe<Item>

Example

1
const findEven = find((number: number) => number % 2 === 0);
2
findEven([1, 2, 3, 4]); // 2
3
findEven([1, 3, 5, 7]); // undefined

View source


groupBy

groupBy<Item, Key>(grouper): (iterable: Readonly<Iterable<Item>>) => Readonly<Record<Key, ReadOnlyArray<Item>>>

Groups values of an iterable in an object based on the output of the grouper function.

Type parameters
NameType
ItemItem
Keyextends PropertyKey
Parameters
NameTypeDescription
grouperUnary<Item, Key>Grouper function.
Returns

fn

Object with grouped values.

▸ (iterable): Readonly<Record<Key, ReadOnlyArray<Item>>>

Parameters
NameType
iterableReadonly<Iterable<Item>>
Returns

Readonly<Record<Key, ReadOnlyArray<Item>>>

Example

1
const groupByType = groupBy((value: number) =>
2
number % 2 === 0 ? "even" : "odd",
3
);
4
groupByType([1, 2, 3, 4, 5]); // { even: [2, 4], odd: [1, 3, 5] }

View source


head

head<Iterable>(iterable): Iterable extends ReadOnlyArray ? Head<Iterable<Iterable>> : Maybe<IsomorphicIterableItem<Iterable>>

Get first element of an iterable (undefined if it is empty).

Type parameters
NameType
Iterableextends Readonly<Iterable<unknown>>
Parameters
NameTypeDescription
iterableIterableIterable to get the first element from.
Returns

Iterable extends ReadOnlyArray ? Head<Iterable<Iterable>> : Maybe<IsomorphicIterableItem<Iterable>>

First element of the iterable (undefined if empty).

Example

1
head([1, 2, 3]); // 1

View source


includes

includes<SearchItem>(searchItem): (iterable: Readonly<Iterable<unknown>>) => boolean

Tries to find the given searchItem in iterable.

Type parameters
Name
SearchItem
Parameters
NameTypeDescription
searchItemSearchItemItem to search.
Returns

fn

Curried function with searchItem set in context.

▸ (iterable): boolean

Parameters
NameType
iterableReadonly<Iterable<unknown>>
Returns

boolean

Example

1
const includesTwo = includes(2);
2
includesTwo([1, 2, 3, 4]); // true
3
includesTwo([1, 3, 5, 7]); // false

View source


iterableToArray

iterableToArray<Iterable>(iterable): ReadOnlyArray<IsomorphicIterableItem<Iterable>>

Turns given iterable into an array.

Type parameters
NameType
Iterableextends Readonly<Iterable<unknown>>
Parameters
NameTypeDescription
iterableIterableIterable to be turned into an array.
Returns

ReadOnlyArray<IsomorphicIterableItem<Iterable>>

Array made of iterable items.

Example

1
iterableToArray([1, 2, 3, 4]); // [1, 2, 3, 4]

View source


join

join(separator): <Item>(iterable: Readonly<Iterable<Item>>) => string

Takes a separator string and a iterable and returns a string with the concatenation of all the elements separated by the separator.

Parameters
NameTypeDescription
separatorstringString to use as separator.
Returns

fn

Curried function with separator in context.

▸ <Item>(iterable): string

Type parameters
NameType
Itemextends Strigifiable
Parameters
NameType
iterableReadonly<Iterable<Item>>
Returns

string

Example

1
const joinWithSpaces = join(" ");
2
joinWithSpaces([1, 2, 3]); // "1 2 3"

View source


length

length(iterable): number

Get the length of an iterable.

Parameters
NameTypeDescription
iterableReadonly<Iterable<unknown>>Iterable to get the length from.
Returns

number

Promise with the length of the iterable.

Example

1
length([1, 2, 3]); // 3

View source


reduce

reduce<Item, Accumulator>(reducer): (initialValue: Accumulator) => (iterable: Readonly<Iterable<Item>>) => Accumulator

Reducer function for iterables.

Type parameters
Name
Item
Accumulator
Parameters
NameTypeDescription
reducerReducer<Item, Accumulator>Reducer function.
Returns

fn

Curried function with reducer in context.

▸ (initialValue): (iterable: Readonly<Iterable<Item>>) => Accumulator

Parameters
NameType
initialValueAccumulator
Returns

fn

▸ (iterable): Accumulator

Parameters
NameType
iterableReadonly<Iterable<Item>>
Returns

Accumulator

Example

1
const sum = reduce<number>(item => total => total + item);
2
const sumFrom0 = sum(0);
3
4
sumFrom0([1, 2, 3]); // 6

View source


some

some<Item, Predicated>(predicate): (iterable: Readonly<Iterable<Item>>) => boolean

Evaluates items in an iterable against a predicate and returns true if any item evaluates to true.

Type parameters
NameType
ItemItem
Predicatednever
Parameters
NameTypeDescription
predicateSingle<Predicated> extends Single<never> ? Unary<Item, boolean> : Predicate<Item, Predicated>Predicate function to evaluate each item.
Returns

fn

Curried function with predicate set in context.

▸ (iterable): boolean

Parameters
NameType
iterableReadonly<Iterable<Item>>
Returns

boolean

Example

1
const someEven = some((number: number) => number % 2 === 0);
2
someEven([1, 2, 3, 4]); // true
3
someEven([1, 3, 5, 7]); // false

View source