Creates a very simple monad, so you can give it a value - continually modifying it as you'd like, and then get a value out of it.
addTwo = (value) => value + 2;
addTwo(3); // 5
console.log(
utils.chain(3)
.chain(addTwo) // (3 + 2)
.chain(addTwo) // (5 + 2)
.debug() // consoles 7 and passes the value along
// define a function inline
.chain((value) => value + 3) // (7 + 3)
.close()
);
// 7
// 10
available as a bookmarklet:
- save a bookmark
- edit and replace the url with the following:
javascript:void%20function(){function%20chain(r){return{value:r,chain:function(n){return%20chain(n(r))},close:function(){return%20r},toArray:function(){return%20chain(Array.from(r))},chainFilter:function(n){if(!Array.isArray(r))throw%20Error(`chainFilter%20expected%20an%20array,%20but%20was%20passed:${r}`);return%20chain(r.filter(n))},chainMap:function(n){if(!Array.isArray(r))throw%20Error(`chainMap%20expected%20an%20array,%20but%20was%20passed:${r}`);return%20chain(r.map(n))},chainReduce:function(n,a){if(!Array.isArray(r))throw%20Error(`chainReduce%20expected%20an%20array,%20but%20was%20passed:${r}`);return%20chain(r.reduce(n,a))},selectAt:function(n){if(!Array.isArray(r))throw%20Error(`selectAt%20expected%20an%20array,%20but%20was%20passed:${r}`);return%20chain(r[n])},replace:function(r){return%20chain(r)},exec:function(n){return%20n(r),chain(r)},debug:function(n){return%20n%3Fn(r):console.log(r),chain(r)}}}window.chain=chain}();