Yisus library
Yisus is a functional programming library for Node JS, developed at Sngular Mexico.
npm install yisus
const Y = require('yisus');
const arr = [1, 2, 3];
Y.map((i) => console.log(i))(arr);
Below show more usage examples.
Apply a modification to an object, this returns a function that requires a target object.
See: Y.map()
const objTarget = {name: 'Yisus', lastname: 'Dev'};
Y.applier({surname: 'Anonymous'})(objTarget);
console.log(objTarget); // {name: 'Yisus', lastname: 'Dev', surname: 'Anonymous'}
// OR
const items = [{name: 'Bruce' }, {name: 'Fabs'}, {name: 'Bruce'}, {name: 'Gaby'}];
Y.map(Y.applier({lastname: 'Anonymous'}))(items);
Compose two o more functions to execute and the result of the first function is the argument to the next function.
See: Y.map()
, Y.filter()
, Y.where()
, Y.equals()
, Y.applier()
const fn1 = n => n * 2;
const fn2 = n => n + 3;
Y.compose(
fn1,
fn2
)(10);
// OR
Y.compose(
Y.map(Y.applier({age: 33})),
Y.filter(Y.where({name: Y.equals('Bruce')}))
)(items);
Returns a constant value in a function.
const c = Y.constant('Bruce');
console.log(c());
Curry a not curried function.
const noCurried = (a, b, c, d) => a + b + c + d;
const x = Y.curry(noCurried);
console.log(x(2)(6)(2)(4));
Create a array of elements that not includes in other array.
Y.diffs([2, 4], [2, 3]); // 4
Create a array of elements that not includes in other array with an iterate.
Y.diffsBy([2.1, 1.2], [2.3, 3.4])(Math.floor)); // [1.2]
Gives a slices of an array.
Y.dropout(2)([1, 2, 3]);
Returns if one value is equal to criteria, this is a Setoid according Fantasy/land Specs
See: Y.filter()
, Y.where()
const items = [{name: 'Bruce' }, {name: 'Fabs'}, {name: 'Bruce'}, {name: 'Gaby'}];
Y.filter(Y.where({name: Y.equals('Bruce')}))(items);
Filter by one where condition.
See: Y.where()
, Y.equals()
, Y.compose()
, Y.map()
const items = [{name: 'Bruce' }, {name: 'Fabs'}, {name: 'Bruce'}, {name: 'Gaby'}];
Y.filter(Y.where({name: Y.equals('Bruce')}))(items);
//OR
Y.compose(
Y.map(Y.applier({age: 33})),
Y.filter(Y.where({name: Y.equals('Bruce')}))
)(items);
//OR
Y.filter(x => x % 2 === 0, {a: 1, b: 2, c: 3, d: 4}); // {b: 2, d: 4}
Filter by one where condition envelop in a promise.
See: Y.pipeP()
, Y.mapP()
, Y.where()
, Y.equals()
, Y.applier()
const items = [{name: 'Bruce' }, {name: 'Fabs'}, {name: 'Bruce'}, {name: 'Gaby'}];
const p = Y.filterP(Y.where({name: Y.equals('Bruce')}))(items);
p.then(i => console.log(i));
//OR
const prom = Y.pipeP(
Y.filterP(Y.where({name: Y.equals('Bruce')})),
Y.mapP(Y.applier({developer: true}))
)(items);
Maps a function over a list, this is the chain according Fantasy/Land Specs
Y.flatMap(n => [n * 2], [1, 2, 3]) // [2, 4, 6]
Make flat an Array.
const test = [{name:'bruce'}, {name:'gaby'}, [{name:'Fabs'}]];
const numbers = [1,2,3,[4,5],[6,7],8,9];
console.log(Y.flatten(test)); // [{name:'bruce'}, {name:'gaby'}, {name:'Fabs'}];
console.log(Y.flatten(numbers)); // [1,2,3,4,5,6,7,8,9]
Recurse over an object, applying a function in each property.
Y.forIn(p => console.log(p), {name: 'Bruce', age: 33}); // name, age
Recurse over a collection, don’t uses loops.
See: Y.applier()
const items = [{name: 'Bruce' }, {name: 'Fabs'}, {name: 'Bruce'}, {name: 'Gaby'}];
Y.forOf((i) => console.log(i))(items);
//OR
Y.forOf((i) => Y.applier({surname: 'Anonymous'})(i))(items);
Gives an array with arrays fragmented.
Y.frags([1, 2, 3, 4])(2); // [[1, 2], [3, 4]]
Returns if one value is greater than criteria.
See: Y.filter()
, Y.where()
const items = [{age: 30 }, {age: 31}, {age: 28}, {age: 22}];
Y.filter(Y.where({ age: Y.gt(30)}))(items); // [{age:31}]
Returns if one value is greater or equal than criteria.
See: Y.filter()
, Y.where()
const items = [{age: 30 }, {age: 31}, {age: 28}, {age: 22}];
Y.filter(Y.where({ age: Y.gte(30)}))(items); // [{age:30}, {age: 31}]
Create a handler a kind of promise
const fnSuccess = r => console.log(r);
const fnError = e => console.log(e);
const fnSum = a => (rs, rj) => setTimeout(() => rs(a + 5), 500);
const fnMult = a => (rs, rj) => setTimeout(() => rs(a * 3), 500);
Y.handler(fnSum)(Y.handler(fnMult)(fnSuccess, fnError), fnError)(10); // 45
Gets if a predicate is in an array of objects.
const addresses = [{ ip: '192.22.56.0'}, { ip: '192.18.3.3'}];
Y.includes(Y.where({ip: Y.equals('192.22.56.0')}), addresses); // true
Gets keys from an object.
const obj = {name: 'Eduardo', last: 'Romero', user: { id: 33 }};
console.log('keys', Y.keys(obj)); //[ 'name', 'last', 'user' ]
Returns if one value is less than criteria.
See: Y.filter()
, Y.where()
const items = [{age: 30 }, {age: 31}, {age: 34}, {age: 33}];
Y.filter(Y.where({ age: Y.lt(33) }))(items); // [{age: 30}, {age: 31}]
Returns if one value is less or equal than criteria.
See: Y.filter()
, Y.where()
, Y.equals()
const items = [{name: 'Bruce', age: 32}, {name: 'Fabs', age: 25}, {name: 'Gaby', age: 33}];
Y.filter(Y.where({ age: Y.lte(33), name: Y.equals('Gaby')}))(items) //[{name: 'Gaby', age: 33}]
Create a map function for iterate over collections
See: Y.compose()
, Y.filter()
, Y.where()
, Y.equals()
, Y.applier()
const items = [1, 2, 3];
Y.map(x => console.log(x))(items); // 1, 2, 3
//OR
const persons = [{name: 'Bruce' }, {name: 'Fabs'}, {name: 'Bruce'}, {name: 'Gaby'}];
Y.compose(
Y.map(Y.applier({age: 33})),
Y.filter(Y.where({name: Y.equals('Bruce')}))
)(persons);
//OR
Y.map(x => x + 1, {a: 1, b: 2, c: 3, d: 4}); // { a: 2, b: 3, c: 4, d: 5 }
Create a map function for iterate over collections envelop in a promise.
See: Y.pipeP()
, Y.filterP()
, Y.applier()
, Y.where()
const items = [{name: 'Bruce'}, {name: 'Fabs'}];
const p = Y.mapP(Y.applier({developer: true}))(items);
p.then(r => console.log(items)); // [{name: 'Bruce', developer: true}, {name: 'Fabs', developer: true}]
//OR
const prom = Y.pipeP(
Y.filterP(Y.where({name: Y.equals('Bruce')})),
Y.mapP(Y.applier({developer: true}))
)(items);
prom.then(r => console.log(items)); // [{name: 'Bruce', developer: true}, {name: 'Fabs'}]
Merge two objects in a new object.
const obj = {name: 'Bruce', age: 30, child: {name:'Joker'}};
const no = Y.merge(obj)({});
console.log(no.child===obj.child);
Merge two object deeply in a new object.
const oMergeT = {name: 'Bruce', last: 'Dick', user: { id: 22, username: 'xxx'}};
const oMergeS = {name: 'Bruce', last: 'Dick', user: { id: 33 }};
console.log('mergeDeep', Y.mergeDeep(oMergeT, oMergeS));
/*mergeDeep { name: 'Bruce',
last: 'Dick',
user: { id: 33, username: 'xxx' } }*/
Create a pipeline for functions.
const fn1 = n => n * 2;
const fn2 = n => n + 6;
const fn3 = n => n - 2;
console.log(Y.pipe(fn1, fn2, fn3)(10));
Create a pipe for promises.
See: Y.filterP()
, Y.mapP()
, Y.where()
, Y.applier()
, Y.equals()
const p1 = (n) => new Promise(resolve => {
setTimeout(() => resolve(n * 2), 3000);
});
const p2 = (n) => new Promise(resolve => {
setTimeout(() => resolve(n + 1), 2000);
});
const p3 = (n) => new Promise(resolve => {
setTimeout(() => resolve(n + 3), 1000);
});
const pip = Y.pipeP(
p1,
p2,
p3
)(2);
pip.then(r => console.log(r)); // 8
//OR
const prom = Y.pipeP(
Y.filterP(Y.where({name: Y.equals('Bruce')})),
Y.mapP(Y.applier({developer: true}))
)(items);
Create a new thunk
const th = Y.thunk((a, b) => a + b)(2, 3);
console.log(th()); // 5
Create a transducer using a compose functions.
Transducers are composable and efficient data transformation functions which doesn’t create intermediate collections.
const xform = Y.compose(
Y.map(x => x + 1),
Y.filter(x => x % 2 === 0)
);
Y.transducer(xform, (xs, x) => {
xs.push(x);
return xs;
}, [], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
// [ 2, 4, 6, 8, 10 ]
Create a where condition function.
See: Y.filter()
, Y.where()
, Y.equals()
Y.filter(Y.where({name: Y.equals('Bruce')}))(items);