Skip to main content
Deno 2 is finally here 🎉️
Learn more
Module

x/proc/src/enumerable.ts>Enumerable

A better way to work with processes in Deno.
Latest
class Enumerable
implements AsyncIterable<T>
import { Enumerable } from "https://deno.land/x/proc@0.22.1/src/enumerable.ts";

Enumerable wrapper for AsyncIterable.

Use the factory function enumerate to create new instances.

Constructors

new
Enumerable(iter: AsyncIterable<T>)

Construct a new enumerable wrapper.

Properties

readonly
chunkedLines: ChunkedLines<T>

Convert to text lines, grouped into arrays.

For large data or data that is broken into many small lines, this can improve performance over lines.

readonly
first: Promise<T>

Take the head of the enumeration.

This operation is equivalent to take(1) and consumes the enumeration.

readonly
lines: Lines<T>

Convert to text lines.

Note that this should probably only be used with small data. Consider chunkedLines to improve performance with larger data.

Methods

collect(): Promise<T[]>

Collect the items in this iterator to an array.

concat(other: AsyncIterable<T>): Enumerable<T>

Concatenate the iterables together.

concurrentMap<U>(mapFn: (item: T) => Promise<U>, options?: ConcurrentOptions): Enumerable<U>

Map the sequence from one type to another, concurrently.

Results are returned in order. The order of processing is concurrent, and therefore somewhat arbitrary.

concurrentUnorderedMap<U>(mapFn: (item: T) => Promise<U>, options?: ConcurrentOptions): Enumerable<U>

Map the sequence from one type to another, concurrently.

Items are iterated out of order. This allows maximum concurrency at all times, but the output order cannot be assumed to be the same as the input order.

This guarantees maximum concurrency whereas concurrentMap does not if the workload isn't balanced. Prefer concurrentUnorderedMap to concurrentMap for best/consistent performance.

count(filterFn?: (item: T) => boolean | Promise<boolean>): Promise<number>

Count the number of items; optionally with a filter.

drop<N extends number = 1>(n?: N): Enumerable<T>

Drop the first n items, return the rest.

enum(): Enumerable<[T, number]>

Adds a counter from 0 to n-1 of the items being enumerated.

every(everyFn: (element: T) => boolean | Promise<boolean>): Promise<boolean>

Return true if every element satisfies the provided testing function.

filter(filterFn: (item: T) => boolean | Promise<boolean>): Enumerable<T>

Filter the sequence to contain just the items that pass a test.

filterNot(filterFn: (item: T) => boolean | Promise<boolean>): Enumerable<T>

Filter the sequence to exclude the items that pass a test. This returns the inverse of filter.

find(findFn: (element: T) => unknown | Promise<unknown>): Promise<T | undefined>

Return the first element that satisfies the provided testing function, or undefined if no value satisfies the testing function.

flatMap<U>(mapFn: (item: T) => U | Promise<U>): Enumerable<ElementType<U>>

Equivalent to calling map followed by flatten.

flatten(): Enumerable<ElementType<T>>

Flatten the iterable.

forEach(forEachFn: (item: T) => void | Promise<void>): Promise<void>

Perform an operation for each item in the sequence.

map<U>(mapFn: (item: T) => U | Promise<U>): Enumerable<U>

Map the iterator from one type to another.

reduce(reduceFn: (
acc: T,
item: T,
index: number,
) => T | Promise<T>
): Promise<T>

Executes a user-supplied "reducer" callback function on each element of the array, in order, passing in the return value from the calculation on the preceding element. The final result of running the reducer across all elements of the array is a single value.

reduce<U>(reduceFn: (
acc: U,
item: T,
index: number,
) => U | Promise<U>
, zero: U
): Promise<U>

Executes a user-supplied "reducer" callback function on each element of the array, in order, passing in the return value from the calculation on the preceding element. The final result of running the reducer across all elements of the array is a single value.

run<S>(options: ProcessOptions<S>, ...cmd: Cmd): Run<S, T>

Run a process.

run(...cmd: Cmd): Run<unknown, T>

Run a process.

some(someFn: (element: T) => boolean | Promise<boolean>): Promise<boolean>

Return true if some element satisfies the provided testing function.

take<N extends number = 1>(n?: N): Enumerable<T>

Take the first n items.

tee<N extends number = 2>(n?: N): Tuple<Enumerable<T>, N>

Split into 2 or more identical iterators.

toStdout(): ByteSink<T>

Dump output to stdout. Non-locking.

transform<U>(fn: TransformerFunction<T, U> | TransformStream<T, U>): Enumerable<U>

Transform the iterable from one type to another with an opportunity to catch and handle errors.

unzip<A, B>(): Unzip<T>

Unzip a collection of [A, B] into Enumerable<A> and Enumerable<B>.

Note that this operations uses tee, so it will use memory during the iteration.

Example

const [a, b] = enumerate([[1, "A"], [2, "B"], [3, "C"]]).unzip();

// a is number[] -> [1, 2, 3]
// b is string[] -> ["A", "B", "C"]
writeBytesTo(writer: Writer & Closer): ByteSink<T>

Dump output to a writer and close it.

This is a low-level asynchronous write of bytes without locking.

writeTo(writer: Writable<T> | WritableStream<T>, options?: { noclose?: boolean; }): Promise<void>

Write all data to the writer.

Example

Write some numbers to stdout.

range({to: 99})
  .map(n => n.toString())
  .transform(toBytes)
  .writeTo(Deno.stdout.writable, {noclose: true});
zip<U>(other: AsyncIterable<U>): Enumerable<[T, U]>

Zip two Enumerables together. If collections are unequal length, the longer collection is truncated.

Example

const a = range({ from: 1, until: 3 });
const b = enumerate(["A", "B", "C"]);

const result = a.zip(b);

// [[1, "A"], [2, "B"], [3, "C"]]
[Symbol.asyncIterator](): AsyncGenerator<T, void, unknown>

Implement AsyncIterable<T>.