Transformers

proc ships with some useful transformers.

A transformer is a plain-old JavaScript function with this signature:

type Transformer<T, U> = (it: AsyncIterable<T>) => AsyncIterable<U>;

Transformers are functions (and may be defined using asynchronous generator functions). You can compose them into new functions relatively easily. The transform operation is like pipeThrough in streaming.

A transformer transforms objects from one type to another. It is like map but with with complete control over the whole stream of data - including control over error handling.

You can create a transformer using an asynchronous generator. This one will transform strings to lower-case:

async function* toLower(texts: AsyncIterable<string>) { for await (const text of texts) { yield text.toLocaleLowerCase(); } }

Here it is in action:

const lowered = await enumerable(["A", "B", "C"]) .transform(toLower) .collect(); assertEquals(lowered, ["a", "b", "c"], "Transformed to lower-case.");