1.0.2 • Published 4 years ago
fp-magic v1.0.2
fp-magic
The power of functional programming — сreate functions with labels that define behavior.
Zero dependencies!
Install
npm install fp-magicUsage
Import
import {createFunctor} from 'fp-magic';Simple examples
const FlatWithSet = createFunctor<'set'>()(({set}) => (list: number[][]) =>
list.map(e => set(e) ? [...new Set(e)] : e).flat()
);
FlatWithSet(({set}) => [[1, 2], [3, 4, 4], set([1, 1, 1, 2])]);
// 1, 2, 3, 4, 4, 1, 2
const squareFunctor = createFunctor<'square'>();
const sumWithSquare = squareFunctor(({ square }) => (list: number[]) =>
list.reduce((sum, e) => sum + (square(e) ? e * e : e), 0)
);
sumWithSquare(({square}) => [1, 2, square(3)]);
// 1 + 2 + 3*3 = 12
const AND = createFunctor<'a' | 'b'>()(({a, b}) => (x: number[][]) =>
a(x[0]) ? (b(x[1]) ? x[0].concat(x[1]) : x[0]) : b(x[1]) ? x[1] : []
);
console.log(AND.labels); // ['a', 'b']
AND(({a, b}) => [a([1, 2, 3]), b([4, 5, 6])]); // [1,2,3,4,5,6]
AND((f) => [[1, 2, 3], f.b([4, 5, 6])]); // [4,5,6]
AND(({a}) => [a([1, 2, 3]), [4, 5, 6]]); // [1,2,3]
AND(() => [[1, 2, 3], [4, 5, 6],]); // []Integrate example
import {mergeWith} from 'lodash';
import {createFunctor} from 'fp-magic';
export const merge = createFunctor<'replace' | 'concat' | 'del'>()(l => (objects: Record<string, unknown>[]) => {
return mergeWith({}, ...objects, (obj, src) => {
if (l.replace(src)) {
return src;
}
if (l.concat(src)) {
return (obj ?? []).concat(src ?? []);
}
if (l.del(src)) {
const result = obj ?? {};
for (const key in (src ?? {})) {
if (key in result) {
delete result[key];
}
}
return result;
}
return undefined;
});
});
merge(l => [
{a: [1], b: {e: 1}, c: {d: null}},
{a: l.concat([2, 3]), b: l.replace({f: 1}), c: del({d: null})}
]); // {a: [1, 2, 3], b: {f: 1}, c: {}}Attention
Primitive values in wrapper functions can remain in the form of Object(PrimitiveValue).
If it is important for you to check such values, use the function isPrimitiveWrapper to check and the function getValueFromWrapper to get the primitive value.