Composition
Composition in fnts
is represented through the compose
and pipe
functions.
Both accept two functions at a time, allowing for safer type inference which
is not always possible with overloads or event without them (which happened
in 1.x versions of fnts
).
Commonly, as well as in fnts
, compose
is used to apply a list of functions
to an argument, passing the result of each application to the next one in a
right to left order:
import compose from 'fnts/compose';
const isTwoDigits = compose(
compose(
(b: boolean) => b ? 'true' : 'false',
(s: string) => s.length === 2 // argument type imposed from the next function
),
(n: number) => `${n}`,
); // will accept only a number as argument
isTwoDigits(5) === 'false';
isTwoDigits(14) === 'true';
pipe
, on the other hand, is executed in a more familiar left to right
order:
import pipe from 'fnts/pipe';
const isTwoDigits = pipe(
pipe(
(n: number) => `${n}`,
(s: string) => s.length === 2
),
(b: boolean) => b ? 'true' : 'false',
);
isTwoDigits(5) === 'false';
isTwoDigits(14) === 'true';
Both compose
and pipe
allow for their first to-be-executed function to
have multiple arguments.
import compose from 'fnts/compose';
const isEvenSum = compose(
compose(
(b: boolean) => b ? 'true' : 'false',
(s: number) => s % 2 === 0
),
(a: number, b: number) => a + b,
);
isEvenSum(2, 2) === 'true';
isEvenSum(17, 32) === 'false';