fpo
Version:
FP library for JavaScript. Supports named-argument style methods.
6 lines (5 loc) • 14.4 kB
JavaScript
/*! fpo.js
v6.1.11 (c) 2022 Kyle Simpson
MIT License: http://getify.mit-license.org
*/
!function UMD(r,n,t){"function"==typeof define&&define.amd?define(t):"undefined"!=typeof module&&module.exports?module.exports=t():n[r]=t(r,n)}("FPO",this,(function DEF(r,n){"use strict";var t={identity:curryMultiple({fn:identity,n:1}),constant:curryMultiple({fn:constant,n:1}),pick:curryMultiple({fn:pick,n:2}),pickAll:curryMultiple({fn:pickAll,n:2}),nAry:curryMultiple({fn:nAry,n:2}),unary:curryMultiple({fn:function unary({fn:r,prop:n=""}){return nAry({fn:r,props:[n]})},n:2}),binary:curryMultiple({fn:function binary({fn:r,props:[n="",t=""]=[]}){return nAry({fn:r,props:[n,t]})},n:2}),curry:curryMultiple({fn:function curry({fn:r,n:n=1}){return n=Number(n),function nextCurried(t){return function curried(e={}){var u=Object.keys(e),l=u.length>0?Object.assign({},t,{[u[0]]:e[u[0]]}):t;return Object.keys(l).length>=n?r(l):nextCurried(l)}}({})},n:1}),curryMultiple:curryMultiple({fn:curryMultiple,n:1}),uncurry:curryMultiple({fn:function uncurry({fn:r}){return function uncurried(n={}){var t=r;for(let r of Object.keys(n))t=t({[r]:n[r]});return t}},n:1}),partial:curryMultiple({fn:function partial({fn:r,args:n={}}){return function partiallyApplied(t={}){return r(Object.assign({},n,t))}},n:2}),complement:curryMultiple({fn:complement,n:1}),apply:curryMultiple({fn:apply,n:1}),unapply:curryMultiple({fn:unapply,n:2}),compose:curryMultiple({fn:function compose({fns:r=[]}){return function composed({v:n}){for(let t=r.length-1;t>=0;t--)n=r[t]({v:n});return n}},n:1}),pipe:curryMultiple({fn:function pipe({fns:r=[]}){return function piped({v:n}){for(let t of r)n=t({v:n});return n}},n:1}),prop:curryMultiple({fn:prop,n:2}),setProp:curryMultiple({fn:setProp,n:3}),reassoc:curryMultiple({fn:reassoc,n:2}),filterIn:curryMultiple({fn:filterIn,n:2}),filterInObj:curryMultiple({fn:filterInObj,n:2}),filterOut:curryMultiple({fn:filterOut,n:2}),filterOutObj:curryMultiple({fn:filterOutObj,n:2}),map:curryMultiple({fn:map,n:2}),mapObj:curryMultiple({fn:mapObj,n:2}),flatMap:curryMultiple({fn:flatMap,n:2}),flatMapObj:curryMultiple({fn:flatMapObj,n:2}),ap:curryMultiple({fn:function ap({fns:r=[],arr:n=[]}){var t=[];0==r.length&&(r=[identity]);if(1==r.length)return map({fn:r[0],arr:n});for(let e of r)t=t.concat(map({fn:e,arr:n}));return t},n:2}),reduce:curryMultiple({fn:reduce,n:2}),reduceObj:curryMultiple({fn:reduceObj,n:2}),reduceRight:curryMultiple({fn:reduceRight,n:2}),flatten:curryMultiple({fn:flatten,n:1}),zip:curryMultiple({fn:zip,n:2}),trampoline:curryMultiple({fn:trampoline,n:1}),transducers:{transduce:curryMultiple({fn:transduce,n:4}),into:curryMultiple({fn:function into({fn:r,v:n,arr:e=[]}){var u="string"==typeof n?strConcat:"number"==typeof n?numericAdd:"boolean"==typeof n?booleanAnd:Array.isArray(n)?arrayPush:t.transducers.default;return transduce({fn:r,co:u,v:n,arr:e})},n:3}),map:curryMultiple({fn:function transducerMap(r){var{fn:n,v:t}=r;if(!_hasProp(r,"v")||!t)return function curried({v:r}){return transducerMap({fn:n,v:r})};return function reducer({acc:r,v:e}){return t({acc:r,v:n({v:e})})}},n:1}),filter:curryMultiple({fn:function transducerFilter(r){var{fn:n,v:t}=r;if(!_hasProp(r,"v")||!t)return function curried({v:r}){return transducerFilter({fn:n,v:r})};return function reducer({acc:r,v:e}={}){return n({v:e})?t({acc:r,v:e}):r}},n:1}),string:curryMultiple({fn:strConcat,n:2}),array:curryMultiple({fn:arrayPush,n:2}),number:curryMultiple({fn:numericAdd,n:2}),booleanAnd:curryMultiple({fn:booleanAnd,n:2}),booleanOr:curryMultiple({fn:function booleanOr({acc:r,v:n}){return!!r||!!n},n:2}),default:curryMultiple({fn:({acc:r})=>r,n:1})},head:curryMultiple({fn:head,n:1}),tail:curryMultiple({fn:tail,n:1}),take:curryMultiple({fn:take,n:1}),memoize:curryMultiple({fn:memoize,n:1}),remap:curryMultiple({fn:remap,n:2})};return t.std={identity:stdCurryMultiple(unapply({fn:identity,props:["v"]}),1),constant:stdCurryMultiple(unapply({fn:constant,props:["v"]}),1),pick:stdCurryMultiple(unapply({fn:pick,props:["props","v"]}),2),pickAll:stdCurryMultiple(unapply({fn:pickAll,props:["props","v"]}),2),nAry:stdCurryMultiple(stdNAry,2),unary:stdCurryMultiple((function stdUnary(r){return stdNAry(r,1)}),1),binary:stdCurryMultiple((function stdBinary(r){return stdNAry(r,2)}),1),curry:stdCurryMultiple((function stdCurry(r,n=Math.max(1,r.length)){return n=Number(n),function nextCurried(t){return function curried(...e){var u=e.length>0?t.concat([e[0]]):t;return u.length>=n?r(...u):nextCurried(u)}}([])}),1),curryMultiple:stdCurryMultiple(stdCurryMultiple,1),uncurry:stdCurryMultiple((function stdUncurry(r){return function uncurried(...n){var t=r;for(let r of n)t=t(r);return t}}),1),partial:stdCurryMultiple((function stdPartial(r,n=[]){return function partiallyApplied(...t){return r(...n,...t)}}),2),partialRight:stdCurryMultiple((function stdPartialRight(r,n=[]){return function partiallyApplied(...t){return r(...t,...n)}}),2),complement:stdCurryMultiple(unapply({fn:complement,props:["fn"]}),1),apply:stdCurryMultiple((function stdApply(r){return function appliedFn(n){return r(...n)}}),1),unapply:stdCurryMultiple((function stdUnapply(r){return function unappliedFn(...n){return r(n)}}),1),compose:stdCurryMultiple((function stdCompose(r=[]){return function composed(n){for(let t=r.length-1;t>=0;t--)n=r[t](n);return n}}),1),pipe:stdCurryMultiple((function stdPipe(r=[]){return function piped(n){for(let t of r)n=t(n);return n}}),1),prop:stdCurryMultiple(unapply({fn:prop,props:["prop","v"]}),2),setProp:stdCurryMultiple(unapply({fn:setProp,props:["prop","o","v"]}),3),reassoc:stdCurryMultiple(unapply({fn:reassoc,props:["props","v"]}),2),filterIn:stdCurryMultiple(unapply({fn:_applyFnProp(filterIn,["v","i","arr"]),props:["fn","arr"]}),2),filterInObj:stdCurryMultiple(unapply({fn:_applyFnProp(filterInObj,["v","i","o"]),props:["fn","o"]}),2),filterOut:stdCurryMultiple(unapply({fn:_applyFnProp(filterOut,["v","i","arr"]),props:["fn","arr"]}),2),filterOutObj:stdCurryMultiple(unapply({fn:_applyFnProp(filterOutObj,["v","i","o"]),props:["fn","o"]}),2),map:stdCurryMultiple(unapply({fn:_applyFnProp(map,["v","i","arr"]),props:["fn","arr"]}),2),mapObj:stdCurryMultiple(unapply({fn:_applyFnProp(mapObj,["v","i","o"]),props:["fn","o"]}),2),flatMap:stdCurryMultiple(unapply({fn:_applyFnProp(flatMap,["v","i","arr"]),props:["fn","arr"]}),2),flatMapObj:stdCurryMultiple(unapply({fn:_applyFnProp(flatMapObj,["v","i","o"]),props:["fn","o"]}),2),ap:stdCurryMultiple((function stdAp(r=[],n=[]){var e=[];0==r.length&&(r=[t.std.identity]);if(1==r.length)return t.std.map(r[0],n);for(let u of r)e=e.concat(t.std.map(u,n));return e}),2),reduce:stdCurryMultiple(unapply({fn:_applyFnProp(reduce,["acc","v","i","arr"]),props:["fn","v","arr"]}),3),reduceObj:stdCurryMultiple(unapply({fn:_applyFnProp(reduceObj,["acc","v","i","o"]),props:["fn","v","o"]}),3),reduceRight:stdCurryMultiple(unapply({fn:_applyFnProp(reduceRight,["acc","v","i","arr"]),props:["fn","v","arr"]}),3),flatten:stdCurryMultiple(unapply({fn:flatten,props:["v","n"]}),1),zip:stdCurryMultiple(unapply({fn:zip,props:["arr1","arr2"]}),2),trampoline:stdCurryMultiple(unapply({fn:trampoline,props:["fn"]}),1),transducers:{transduce:stdCurryMultiple(stdTransduce,4),into:stdCurryMultiple((function stdInto(r,n,e=[]){var u="string"==typeof n?stdStrConcat:"number"==typeof n?stdNumericAdd:"boolean"==typeof n?stdBooleanAnd:Array.isArray(n)?stdArrayPush:t.std.transducers.default;return stdTransduce(r,u,n,e)}),3),map:stdCurryMultiple((function stdTransducerMap(r,n){return function reducer(t,e){return n(t,r(e))}}),2),filter:stdCurryMultiple((function stdTransducerFilter(r,n){return function reducer(t,e){return r(e)?n(t,e):t}}),2),string:stdCurryMultiple(stdStrConcat,2),array:stdCurryMultiple(stdArrayPush,2),number:stdCurryMultiple(stdNumericAdd,2),booleanAnd:stdCurryMultiple(stdBooleanAnd,2),booleanOr:stdCurryMultiple((function stdBooleanOr(r,n){return!!r||!!n}),2),default:stdCurryMultiple((r=>r),1)},flip:stdCurryMultiple((function stdFlip(r){return function flipped(n,t,...e){return r(t,n,...e)}}),1),reverseArgs:stdCurryMultiple((function stdReverseArgs(r){return function reversed(...n){return r(...n.reverse())}}),1),head:stdCurryMultiple(unapply({fn:head,props:["v"]}),1),tail:stdCurryMultiple(unapply({fn:tail,props:["v"]}),1),take:stdCurryMultiple(unapply({fn:take,props:["v","n"]}),1),memoize:stdCurryMultiple(unapply({fn:memoize,props:["fn","n"]}),1),remap:stdCurryMultiple(unapply({fn:remap,props:["fn","args"]}),2)},_setMethodAlias("constant","always"),_setMethodAlias("pipe","flow"),_setMethodAlias("pipe","sequence"),_setMethodAlias("compose","flowRight"),_setMethodAlias("apply","spread"),_setMethodAlias("unapply","gather"),_setMethodAlias("setProp","assoc"),_setMethodAlias("filterIn","filter"),_setMethodAlias("filterIn","keep"),_setMethodAlias("filterInObj","filterObj"),_setMethodAlias("filterInObj","keepObj"),_setMethodAlias("filterOut","reject"),_setMethodAlias("filterOutObj","rejectObj"),_setMethodAlias("flatMap","chain"),_setMethodAlias("flatMapObj","chainObj"),_setMethodAlias("reduce","fold"),_setMethodAlias("reduceObj","foldObj"),_setMethodAlias("reduce","foldL"),_setMethodAlias("reduceRight","foldR"),t.partialRight=t.partial,t.transducers.boolean=t.transducers.booleanAnd,t.std.transducers.boolean=t.std.transducers.booleanAnd,t;function identity({v:r}){return r}function constant({v:r}){return function value(){return r}}function pick({v:r,props:n=[]}){var t={};for(let e of n)_hasProp(r,e)&&(t[e]=r[e]);return t}function pickAll({v:r,props:n=[]}){var t={};for(let e of n)t[e]=r[e];return t}function nAry({fn:r,props:n=[]}){return function limited(t={}){return r(pick({v:t,props:n}))}}function stdNAry(r,n=0){return n=Number(n),function nary(...t){return r(...t.slice(0,Math.max(0,n)))}}function curryMultiple({fn:r,n:n=1}){return n=Number(n),function nextCurried(t){return function curried(e={}){var u=Object.keys(e).length>0?Object.assign({},t,e):t;return Object.keys(u).length>=n?r(u):nextCurried(u)}}({})}function stdCurryMultiple(r,n=Math.max(1,r.length)){return n=Number(n),function nextCurried(t){return function curried(...e){var u=e.length>0?t.concat(e):t;return u.length>=n?r(...u):nextCurried(u)}}([])}function complement({fn:r}){return function complemented(...n){return!r(...n)}}function apply({fn:r,props:n=r.toString().replace(/^(?:(?:function.*\(([^]*?)\))|(?:([^\(\)]+?)\s*=>)|(?:\(([^]*?)\)\s*=>))[^]+$/,"$1$2$3").split(/\s*,\s*/).map((r=>r.replace(/[=\s].*$/,"")))}){return function appliedFn(t){return r(...n.map((function getPropVal(r){return t[r]})))}}function unapply({fn:r,props:n=[]}){return function unappliedFn(...t){for(var e={},u=0,l=0;u<n.length&&l<t.length;)e[n[u++]]=t[l++];return r(e)}}function prop({prop:r="",v:n={}}){return n[r]}function setProp({prop:r="",o:n={},v:t}){return(n=Object.assign({},n))[r]=t,n}function reassoc({props:r={},v:n}){var t={},e=Object.keys(r);for(let u of e)u in n&&(t[r[u]]=n[u]);for(let r of Object.keys(n))~e.indexOf(r)||(t[r]=n[r]);return t}function filterIn({fn:r,arr:n=[]}){var t=[];for(let[e,u]of n.entries())r({v:u,i:e,arr:n})&&(t[t.length]=u);return t}function filterInObj({fn:r,o:n={}}){var t={};for(let e of Object.keys(n))r({v:n[e],i:e,o:n})&&(t[e]=n[e]);return t}function filterOut({fn:r,arr:n=[]}){return filterIn({fn:complement({fn:r}),arr:n})}function filterOutObj({fn:r,o:n={}}){return filterInObj({fn:complement({fn:r}),o:n})}function map({fn:r,arr:n=[]}){var t=[];for(let[e,u]of n.entries())t[e]=r({v:u,i:e,arr:n});return t}function mapObj({fn:r,o:n={}}){var t={};for(let e of Object.keys(n))t[e]=r({v:n[e],i:e,o:n});return t}function flatMap({fn:r,arr:n=[]}){var t=[];for(let[e,u]of n.entries())t=t.concat(r({v:u,i:e,arr:n}));return t}function flatMapObj({fn:r,o:n={}}){var t={};for(let e of Object.keys(n)){let u=r({v:n[e],i:e,o:n});"object"!=typeof u||Array.isArray(u)?t[e]=u:Object.assign(t,u)}return t}function reduce({fn:r,v:n,arr:t=[]}){var e=t,u=0;void 0===n&&t.length>0&&(n=t[0],t=t.slice(1),u++);for(let l of t)n=r({acc:n,v:l,i:u++,arr:e});return n}function reduceObj({fn:r,v:n,o:t={}}){var e=Object.keys(t);void 0===n&&e.length>0&&(n=t[e[0]],e=e.slice(1));for(let u of e)n=r({acc:n,v:t[u],i:u,o:t});return n}function reduceRight({fn:r,v:n,arr:t=[]}){var e=t,u=t.length-1;void 0===n&&t.length>0&&(n=t[u],t=t.slice(0,u),u--);for(let l=t.length-1;l>=0;l--)n=r({acc:n,v:t[l],i:u--,arr:e});return n}function flatten({v:r=[],n:n=1/0}){n=Number(n);var t=[];for(let e of r)t=t.concat(n>0?n>1&&Array.isArray(e)?flatten({v:e,n:n-1}):e:[e]);return t}function zip({arr1:r=[],arr2:n=[]}){for(var t=[],e=0,u=0;e<r.length&&u<n.length;)t.push([r[e++],n[u++]]);return t}function trampoline({fn:r}){return function trampolined(...n){for(var t=r(...n);"function"==typeof t;)t=t();return t}}function transduce({fn:r,co:n,v:t,arr:e=[]}){return reduce({fn:r({v:n}),v:t,arr:e})}function stdTransduce(r,n,e,u=[]){var l=r(n);return t.std.reduce(l,e,u)}function strConcat({acc:r,v:n}){return String(r)+n}function stdStrConcat(r,n){return String(r)+n}function arrayPush({acc:r,v:n}){return r.push(n),r}function stdArrayPush(r,n){return r.push(n),r}function numericAdd({acc:r,v:n}){return+r+ +n}function stdNumericAdd(r,n){return+r+ +n}function booleanAnd({acc:r,v:n}){return!!r&&!!n}function stdBooleanAnd(r,n){return!!r&&!!n}function head({v:r=[]}){return!r||"object"!=typeof r&&"string"!=typeof r?r:r[0]}function tail({v:r=[]}){if(r&&("object"==typeof r||"string"==typeof r)){if("function"==typeof r.slice)return r.slice(1);return pick({v:r,props:Object.keys(r).filter((r=>"0"!=r))})}return r}function take({v:r=[],n:n=1}){return!r||"object"!=typeof r&&"string"!=typeof r||"function"!=typeof r.slice?[]:r.slice(0,n)}function memoize({fn:r,n:n=r.length}){var t={};return Number(n)>1?function memoizedMultipleArgs(...n){var e=n[0],u=1==n.length&&(null==e||"object"!=typeof e&&"function"!=typeof e)?e:JSON.stringify(n);return u in t?t[u]:t[u]=r(...n)}:function memoizedSingleArg(n,...e){var u=null==n||"object"!=typeof n&&"function"!=typeof n?n:JSON.stringify(n);return u in t?t[u]:t[u]=r(n,...e)}}function remap({fn:r,args:n={}}){var t={};for(let r of Object.keys(n))t[n[r]]=r;return function remapped(n){return r(reassoc({v:n,props:t}))}}function _setMethodAlias(r,n){t[n]=t[r],t.std[n]=t.std[r]}function _applyFnProp(r,n){return function fnApplied(t){return(t=Object.assign({},t)).fn=apply({fn:t.fn,props:n}),r(t)}}function _hasProp(r,n){return Object.hasOwnProperty.call(r,n)}}));