functional/README.md

3.2 KiB

tk-functional

pipeline status coverage report npm version npm size

About

Provides some common helpers for functional-style programming.

Typescript definitions are included.

Issues can be reported on GitLab.

Functions

always and never return true and false respectively

always()  // => true
never()  // => false

and and or combines predicates

const a = and((x: number) => x > 2, (x: number) => x < 5);
a(2)  // => false
a(3)  // => true
a(4)  // => true
a(5)  // => false
const o = or((x: number) => x < 2, (x: number) => x > 3);
o(1)  // => true
o(2)  // => false
o(3)  // => false
o(4)  // => true

attr gets an object's attribute:

const getx = attr("x");
getx({x: 3});  // => 3

bool checks for boolean equivalence (in a broader sense than !(!(val))):

bool(undefined);  // => false
bool(null);  // => false

bool(-1);  // => true
bool(0);  // => false
bool(1);  // => true

bool("");  // => false
bool(" ");  // => true
bool("abc");  // => true

bool([]);  // => false
bool([1, 2, 3]);  // => true

bool({});  // => false
bool({x: 1});  // => true

cmp simplifies the use of array sorting:

[8, 3, 5].sort(cmp())                            // => [3, 5, 8]
[8, 3, 5].sort(cmp({ reverse: true }))           // => [8, 5, 3]
[-2, 8, -7].sort(cmp({ key: Math.abs }))         // => [-2, -7, 8]

identity returns its argument untouched:

a === identity(a)  // => true

is and isinstance checks for strict equality and inheritance:

const f = is(8);
f(8)      // => true
f(5 + 3)  // => true
f("8")    // => false
f(null)   // => false

class A { }
class A1 extends A { }
class A2 extends A { }
class B { }
const f: any[] = [5, null, undefined, new A, new A1, new B, new A2];
const result: A[] = f.filter(isinstance(A));  // => [f[3], f[4], f[6]]

nn, nu and nnu checks at run-time for null or undefined:

nn(undefined)  // => undefined
nn(null)  // => Error
nn(1)  // => 1

nu(undefined)  // => Error
nu(null)  // => null
nu(1)  // => 1

nnu(undefined)  // => Error
nnu(null)  // => Error
nnu(1)  // => 1

nop does nothing (useful for some callbacks):

new ConstructorWithMandatoryCallback(nop)

partial applies a partial configuration object as first argument of compatible functions:

const sum = (args: {a: number, b: number}) => args.a + args.b
const plus1 = partial({a: 1}, sum);
plus1({b: 8})  // => 9

pipe chains two functions as one:

const f = pipe((x: number) => x * 2, (x: number) => x + 1);
f(3)  // => 7 ((3 * 2) + 1)