@teleology/fp
A collection of functional utilities supporting pipes
pipe
Accepts a variadic list of functions and passes one argument to the next from top-to-bottom.
Example:
const { pipe } = require('@teleology/fp');
const a = (s) => s - 12;
const b = (s) => s * 3;
pipe(
a,
b,
console.log
)(10);
compose
Accepts a variadic list of functions and passes one argument to the next from bottom-to-top.
Example:
const { compose } = require('@teleology/fp');
const a = (s) => s - 12;
const b = (s) => s * 3;
compose(
console.log,
a,
b
)(10);
parallel
Accepts a variadic list of functions and returns a curried function. The curried function can then be invoked and will delegate its arguments in parallel across the functions.
Example:
const { parallel } = require('@teleology/fp');
const logDb = require('./apis/logs');
const logger = parallel(
logDb,
console.log
);
logger({
source: 'app',
action: 'clicked login',
time: Date.now(),
});
toss
Curries an error message returning an invocable function to throw. The invocable function can accept params
to assign additional data to the Error.
Example:
const { toss } = require('@teleology/fp');
toss('An error occured')({ code: 403, reason: 'Entity already exists' });
set
Sets a value at a dot notation path within an object or array, can be curried.
Example:
const { set } = require('@teleology/fp');
set('a.b.c[1].z', 'hello')({})
set('[0].z', 'hello', [])
get
Curry a dot notation path and default value, returns an invocable function requiring a target object.
Example:
const { get } = require('@teleology/fp');
get('[0].a.b')([
{
a: {
b: 'hello',
},
},
]);
pick
Curry an array of dot notation paths, with optional settings. Returns an invocable function requiring a target object.
Example:
const { pick } = require('@teleology/fp');
pick(['a.b', 'a.c[0]', 'a.c[2]'])({
a: {
b: 'hi',
c: [1, 2, 3],
},
});
pick(['a.b', 'a.c[0]', 'a.c[2]'], { clean: true })({
a: {
b: 'hi',
c: [1, 2, 3],
},
});
curry
Curry a specific function with a known arity. Please note, optional arguments are not considered during invocation unless they are explicity set.
Example:
const { curry } = require('@teleology/fp');
const test = (a, b, c) => console.log([a, b, c]);
const curried = curry(3, test);
curried(1, 2, 3);
curried(1)(2)(3);
curried(1)(2, 3);
curried(1, 2)(3);
map
A curried map function to be invoked within an Array.
Example:
const { map } = require('@teleology/fp');
map((a) => a.id)([
{
id: '1',
},
{
id: '2',
},
]);
map(['id'])([
{
id: '1',
name: 'bob',
},
{
id: '2',
name: 'chris',
},
])
filter
A curried filter function to be invoked within an Array.
Example:
const { filter } = require('@teleology/fp');
filter((a) => a.id === '1')([
{
id: '1',
},
{
id: '2',
},
]);
filter({ id: '1' })([
{
id: '1',
},
{
id: '2',
},
]);
find
A curried find function to be invoked within an Array.
Example:
const { find } = require('@teleology/fp');
find((a) => a.id === '1')([
{
id: '1',
},
{
id: '2',
},
]);
find({ id: '1' })([
{
id: '1',
},
{
id: '2',
},
]);
some
A curried some function to be invoked within an Array.
Example:
const { some } = require('@teleology/fp');
some((a) => a.id === '1')([
{
id: '1',
},
{
id: '2',
},
]);
some({ id: '1' })([
{
id: '1',
},
{
id: '2',
},
]);
clean
Recursively removes empty values. An empty value is: null, empty string, undefined, an empty array or object
.
Example:
const { clean } = require('@teleology/fp');
clean({
a: null,
b: '',
c: undefined,
d: {},
e: [],
f: 'hello',
nested: { will: { be: { removed: {} } } },
});
nonce
Wraps a function and prevents it from being called more than n
times. Optional second params is the number of times, default is once
.
Example:
const { nonce } = require('@teleology/fp');
const log = nonce(console.log);
log('hi');
log('bonjour');
retry
Given a function that may throw, retry up to n
times.
Example:
const { retry } = require('@teleology/fp');
const greet = retry(async (name) => {
throw new Error(`${name}, failed to be greeted`);
}, 3);
greet('bob').catch(console.log);
settle
Mimics the traditional Promise.all
but wraps each promise to avoid a throw. Errors contain a reason, successes a value. If a single promise is passed in, the result is a curried promise whose result is wrapped.
const { settle } = require('@teleology/fp');
const ps = [0, 1, 2, 3, 4].map((a) => (async () => a)());
settle(ps).then(console.log);
const safe = settle(async (num) => {
throw new Error(`Failed, ${num}`);
});
safe(10).then(console.log);
timeout
Curries a given function, millis and ensures an error is thrown when a timeout occurs.
const { timeout } = require('@teleology/fp');
const timed = timeout(
async () => new Promise((resolve) => setTimeout(resolve, 9000)),
200,
);
timed('hello').then(console.log).catch(console.log);
poll
A wrapper around a functon to long-poll at pre-defined intervals. Can be used with defaults or a custom rolloff function.
const { poll } = require('@teleology/fp');
const fn = async () => console.log('hello');
const cancel = poll(fn);
const cancel2 = poll(fn, 1000);
const linear = async (i) => new Promise((res) => setTimeout(res, i * 1000));
const cancel3 = poll(fn, linear);
noop
A function that does nothing.
const { noop } = require('@teleology/fp');
noop();
Changelog
2.0.2
2.0.0
- Changed how
pick
operates, to migrate use get
which is now exposed - Updated
clean
to remove empty array items
1.0.14
1.0.10
1.0.9
- Adding
retry, settle
functions - Bug fixes for pipe + compose
1.0.6
1.0.4
- Adding a clean function to remove empty values
1.0.1
- Renaming broadcast to parallel
- Added find, filter functions
- Updated README with examples
- Updated
toss
to be invoked later to capture param