Skip to content

flow

Defined in: Composition/flow.ts:45

readonly async: {<A, B>(ab): (a) => Promise<B>; <A, B, C>(ab, bc): (a) => Promise<C>; <A, B, C, D>(ab, bc, cd): (a) => Promise<D>; <A, B, C, D, E>(ab, bc, cd, de): (a) => Promise<E>; <A, B, C, D, E, F>(ab, bc, cd, de, ef): (a) => Promise<F>; <A, B, C, D, E, F, G>(ab, bc, cd, de, ef, fg): (a) => Promise<G>; <A, B, C, D, E, F, G, H>(ab, bc, cd, de, ef, fg, gh): (a) => Promise<H>; <A, B, C, D, E, F, G, H, I>(ab, bc, cd, de, ef, fg, gh, hi): (a) => Promise<I>; <A, B, C, D, E, F, G, H, I, J>(ab, bc, cd, de, ef, fg, gh, hi, ij): (a) => Promise<J>; <A, B, C, D, E, F, G, H, I, J, K>(ab, bc, cd, de, ef, fg, gh, hi, ij, jk): (a) => Promise<K>; }

Defined in: Composition/flow.ts:477

Pipes a value through a sequence of operations, supporting asynchronous transitions at any step.

<A, B>(ab): (a) => Promise<B>

A

B

(a) => Awaitable<B>

(a) => Promise<B>

<A, B, C>(ab, bc): (a) => Promise<C>

A

B

C

(a) => Awaitable<B>

(b) => Awaitable<C>

(a) => Promise<C>

<A, B, C, D>(ab, bc, cd): (a) => Promise<D>

A

B

C

D

(a) => Awaitable<B>

(b) => Awaitable<C>

(c) => Awaitable<D>

(a) => Promise<D>

<A, B, C, D, E>(ab, bc, cd, de): (a) => Promise<E>

A

B

C

D

E

(a) => Awaitable<B>

(b) => Awaitable<C>

(c) => Awaitable<D>

(d) => Awaitable<E>

(a) => Promise<E>

<A, B, C, D, E, F>(ab, bc, cd, de, ef): (a) => Promise<F>

A

B

C

D

E

F

(a) => Awaitable<B>

(b) => Awaitable<C>

(c) => Awaitable<D>

(d) => Awaitable<E>

(e) => Awaitable<F>

(a) => Promise<F>

<A, B, C, D, E, F, G>(ab, bc, cd, de, ef, fg): (a) => Promise<G>

A

B

C

D

E

F

G

(a) => Awaitable<B>

(b) => Awaitable<C>

(c) => Awaitable<D>

(d) => Awaitable<E>

(e) => Awaitable<F>

(f) => Awaitable<G>

(a) => Promise<G>

<A, B, C, D, E, F, G, H>(ab, bc, cd, de, ef, fg, gh): (a) => Promise<H>

A

B

C

D

E

F

G

H

(a) => Awaitable<B>

(b) => Awaitable<C>

(c) => Awaitable<D>

(d) => Awaitable<E>

(e) => Awaitable<F>

(f) => Awaitable<G>

(g) => Awaitable<H>

(a) => Promise<H>

<A, B, C, D, E, F, G, H, I>(ab, bc, cd, de, ef, fg, gh, hi): (a) => Promise<I>

A

B

C

D

E

F

G

H

I

(a) => Awaitable<B>

(b) => Awaitable<C>

(c) => Awaitable<D>

(d) => Awaitable<E>

(e) => Awaitable<F>

(f) => Awaitable<G>

(g) => Awaitable<H>

(h) => Awaitable<I>

(a) => Promise<I>

<A, B, C, D, E, F, G, H, I, J>(ab, bc, cd, de, ef, fg, gh, hi, ij): (a) => Promise<J>

A

B

C

D

E

F

G

H

I

J

(a) => Awaitable<B>

(b) => Awaitable<C>

(c) => Awaitable<D>

(d) => Awaitable<E>

(e) => Awaitable<F>

(f) => Awaitable<G>

(g) => Awaitable<H>

(h) => Awaitable<I>

(i) => J

(a) => Promise<J>

<A, B, C, D, E, F, G, H, I, J, K>(ab, bc, cd, de, ef, fg, gh, hi, ij, jk): (a) => Promise<K>

A

B

C

D

E

F

G

H

I

J

K

(a) => Awaitable<B>

(b) => Awaitable<C>

(c) => Awaitable<D>

(d) => Awaitable<E>

(e) => Awaitable<F>

(f) => Awaitable<G>

(g) => Awaitable<H>

(h) => Awaitable<I>

(i) => Awaitable<J>

(j) => Awaitable<K>

(a) => Promise<K>

const processId = flow.async(
  (id: number) => Promise.resolve(`user-${id}`),
  name => name.toUpperCase()
);
await processId(42); // "USER-42"

readonly either: <A, B>(predicate, onTrue, onFalse) => (a) => B

Defined in: Composition/flow.ts:416

Executes one of two functions based on a predicate, acting as a functional if-else/ternary helper.

A

B

(a) => boolean

(a) => B

(a) => B

(a) => B

const formatNumber = flow.either(
  (n: number) => n >= 0,
  n => `+${n}`,
  n => `${n}`
);
formatNumber(5);  // "+5"
formatNumber(-3); // "-3"

readonly safe: {<A, B>(ab): (a) => B | Extract<A, null | undefined>; <A, B, C>(ab, bc): (a) => C | Extract<A, null | undefined> | Extract<B, null | undefined>; <A, B, C, D>(ab, bc, cd): (a) => D | Extract<A, null | undefined> | Extract<B, null | undefined> | Extract<C, null | undefined>; <A, B, C, D, E>(ab, bc, cd, de): (a) => E | Extract<A, null | undefined> | Extract<B, null | undefined> | Extract<C, null | undefined> | Extract<D, null | undefined>; <A, B, C, D, E, F>(ab, bc, cd, de, ef): (a) => F | Extract<A, null | undefined> | Extract<B, null | undefined> | Extract<C, null | undefined> | Extract<D, null | undefined> | Extract<E, null | undefined>; <A, B, C, D, E, F, G>(ab, bc, cd, de, ef, fg): (a) => G | Extract<A, null | undefined> | Extract<B, null | undefined> | Extract<C, null | undefined> | Extract<D, null | undefined> | Extract<E, null | undefined> | Extract<F, null | undefined>; <A, B, C, D, E, F, G, H>(ab, bc, cd, de, ef, fg, gh): (a) => H | Extract<A, null | undefined> | Extract<B, null | undefined> | Extract<C, null | undefined> | Extract<D, null | undefined> | Extract<E, null | undefined> | Extract<F, null | undefined> | Extract<G, null | undefined>; <A, B, C, D, E, F, G, H, I>(ab, bc, cd, de, ef, fg, gh, hi): (a) => I | Extract<A, null | undefined> | Extract<B, null | undefined> | Extract<C, null | undefined> | Extract<D, null | undefined> | Extract<E, null | undefined> | Extract<F, null | undefined> | Extract<G, null | undefined> | Extract<H, null | undefined>; <A, B, C, D, E, F, G, H, I, J>(ab, bc, cd, de, ef, fg, gh, hi, ij): (a) => J | Extract<A, null | undefined> | Extract<B, null | undefined> | Extract<C, null | undefined> | Extract<D, null | undefined> | Extract<E, null | undefined> | Extract<F, null | undefined> | Extract<G, null | undefined> | Extract<H, null | undefined> | Extract<I, null | undefined>; <A, B, C, D, E, F, G, H, I, J, K>(ab, bc, cd, de, ef, fg, gh, hi, ij, jk): (a) => K | Extract<A, null | undefined> | Extract<B, null | undefined> | Extract<C, null | undefined> | Extract<D, null | undefined> | Extract<E, null | undefined> | Extract<F, null | undefined> | Extract<G, null | undefined> | Extract<H, null | undefined> | Extract<I, null | undefined> | Extract<J, null | undefined>; }

Defined in: Composition/flow.ts:463

Pipes a value through a sequence of operations, short-circuiting and propagating null or undefined immediately if any intermediate step evaluates to nil.

<A, B>(ab): (a) => B | Extract<A, null | undefined>

A

B

(a) => B

(a) => B | Extract<A, null | undefined>

<A, B, C>(ab, bc): (a) => C | Extract<A, null | undefined> | Extract<B, null | undefined>

A

B

C

(a) => B

(b) => C

(a) => C | Extract<A, null | undefined> | Extract<B, null | undefined>

<A, B, C, D>(ab, bc, cd): (a) => D | Extract<A, null | undefined> | Extract<B, null | undefined> | Extract<C, null | undefined>

A

B

C

D

(a) => B

(b) => C

(c) => D

(a) => D | Extract<A, null | undefined> | Extract<B, null | undefined> | Extract<C, null | undefined>

<A, B, C, D, E>(ab, bc, cd, de): (a) => E | Extract<A, null | undefined> | Extract<B, null | undefined> | Extract<C, null | undefined> | Extract<D, null | undefined>

A

B

C

D

E

(a) => B

(b) => C

(c) => D

(d) => E

(a) => E | Extract<A, null | undefined> | Extract<B, null | undefined> | Extract<C, null | undefined> | Extract<D, null | undefined>

<A, B, C, D, E, F>(ab, bc, cd, de, ef): (a) => F | Extract<A, null | undefined> | Extract<B, null | undefined> | Extract<C, null | undefined> | Extract<D, null | undefined> | Extract<E, null | undefined>

A

B

C

D

E

F

(a) => B

(b) => C

(c) => D

(d) => E

(e) => F

(a) => F | Extract<A, null | undefined> | Extract<B, null | undefined> | Extract<C, null | undefined> | Extract<D, null | undefined> | Extract<E, null | undefined>

<A, B, C, D, E, F, G>(ab, bc, cd, de, ef, fg): (a) => G | Extract<A, null | undefined> | Extract<B, null | undefined> | Extract<C, null | undefined> | Extract<D, null | undefined> | Extract<E, null | undefined> | Extract<F, null | undefined>

A

B

C

D

E

F

G

(a) => B

(b) => C

(c) => D

(d) => E

(e) => F

(f) => G

(a) => G | Extract<A, null | undefined> | Extract<B, null | undefined> | Extract<C, null | undefined> | Extract<D, null | undefined> | Extract<E, null | undefined> | Extract<F, null | undefined>

<A, B, C, D, E, F, G, H>(ab, bc, cd, de, ef, fg, gh): (a) => H | Extract<A, null | undefined> | Extract<B, null | undefined> | Extract<C, null | undefined> | Extract<D, null | undefined> | Extract<E, null | undefined> | Extract<F, null | undefined> | Extract<G, null | undefined>

A

B

C

D

E

F

G

H

(a) => B

(b) => C

(c) => D

(d) => E

(e) => F

(f) => G

(g) => H

(a) => H | Extract<A, null | undefined> | Extract<B, null | undefined> | Extract<C, null | undefined> | Extract<D, null | undefined> | Extract<E, null | undefined> | Extract<F, null | undefined> | Extract<G, null | undefined>

<A, B, C, D, E, F, G, H, I>(ab, bc, cd, de, ef, fg, gh, hi): (a) => I | Extract<A, null | undefined> | Extract<B, null | undefined> | Extract<C, null | undefined> | Extract<D, null | undefined> | Extract<E, null | undefined> | Extract<F, null | undefined> | Extract<G, null | undefined> | Extract<H, null | undefined>

A

B

C

D

E

F

G

H

I

(a) => B

(b) => C

(c) => D

(d) => E

(e) => F

(f) => G

(g) => H

(h) => I

(a) => I | Extract<A, null | undefined> | Extract<B, null | undefined> | Extract<C, null | undefined> | Extract<D, null | undefined> | Extract<E, null | undefined> | Extract<F, null | undefined> | Extract<G, null | undefined> | Extract<H, null | undefined>

<A, B, C, D, E, F, G, H, I, J>(ab, bc, cd, de, ef, fg, gh, hi, ij): (a) => J | Extract<A, null | undefined> | Extract<B, null | undefined> | Extract<C, null | undefined> | Extract<D, null | undefined> | Extract<E, null | undefined> | Extract<F, null | undefined> | Extract<G, null | undefined> | Extract<H, null | undefined> | Extract<I, null | undefined>

A

B

C

D

E

F

G

H

I

J

(a) => B

(b) => C

(c) => D

(d) => E

(e) => F

(f) => G

(g) => H

(h) => I

(i) => J

(a) => J | Extract<A, null | undefined> | Extract<B, null | undefined> | Extract<C, null | undefined> | Extract<D, null | undefined> | Extract<E, null | undefined> | Extract<F, null | undefined> | Extract<G, null | undefined> | Extract<H, null | undefined> | Extract<I, null | undefined>

<A, B, C, D, E, F, G, H, I, J, K>(ab, bc, cd, de, ef, fg, gh, hi, ij, jk): (a) => K | Extract<A, null | undefined> | Extract<B, null | undefined> | Extract<C, null | undefined> | Extract<D, null | undefined> | Extract<E, null | undefined> | Extract<F, null | undefined> | Extract<G, null | undefined> | Extract<H, null | undefined> | Extract<I, null | undefined> | Extract<J, null | undefined>

A

B

C

D

E

F

G

H

I

J

K

(a) => B

(b) => C

(c) => D

(d) => E

(e) => F

(f) => G

(g) => H

(h) => I

(i) => J

(j) => K

(a) => K | Extract<A, null | undefined> | Extract<B, null | undefined> | Extract<C, null | undefined> | Extract<D, null | undefined> | Extract<E, null | undefined> | Extract<F, null | undefined> | Extract<G, null | undefined> | Extract<H, null | undefined> | Extract<I, null | undefined> | Extract<J, null | undefined>

const getCityLength = flow.safe(
  (user: { address?: { city?: string } }) => user.address,
  address => address.city,
  city => city.length
);
getCityLength({ address: { city: "Paris" } }); // 5
getCityLength({});                            // undefined

readonly struct: <A, R>(fields) => (a) => R

Defined in: Composition/flow.ts:446

Builds an object by applying a record of field-level transformer functions to the piped input.

A

R extends Record<string, unknown>

{ [K in string | number | symbol]: (a: A) => R[K] }

(a) => R

type User = { name: string; age: number };
const summarizeUser = flow.struct<User, { name: string; isAdult: boolean }>({
  name: u => u.name,
  isAdult: u => u.age >= 18,
});
summarizeUser({ name: "Alice", age: 25 }); // { name: "Alice", isAdult: true }

readonly try: <A, B, C>(f, onError) => (a) => B | C

Defined in: Composition/flow.ts:431

Creates a pipeline step that wraps a throwing function in a try/catch, returning a fallback value if an error occurs.

A

B

C

(a) => B

(error, value) => C

(a) => B | C

const safeParse = flow.try(
  (s: string) => JSON.parse(s),
  (_err, _s) => null
);
safeParse('{"a":1}'); // { a: 1 }
safeParse('invalid'); // null

readonly unless: <A>(predicate, onFalse) => (a) => A

Defined in: Composition/flow.ts:400

Executes a function on the piped value if a predicate is NOT met, otherwise returns the value unchanged.

A

(a) => boolean

(a) => A

(a) => A

const doubleIfOdd = flow.unless(
  (n: number) => n % 2 === 0,
  n => n * 2
);
doubleIfOdd(5); // 10
doubleIfOdd(4); // 4

readonly when: <A>(predicate, onTrue) => (a) => A

Defined in: Composition/flow.ts:385

Executes a function on the piped value if a predicate is met, otherwise returns the value unchanged.

A

(a) => boolean

(a) => A

(a) => A

const doubleIfEven = flow.when(
  (n: number) => n % 2 === 0,
  n => n * 2
);
doubleIfEven(4); // 8
doubleIfEven(5); // 5