UNPKG

rubico

Version:

[a]synchronous functional programming

8 lines (7 loc) 10.7 kB
/** * rubico v2.6.2 * https://github.com/a-synchronous/rubico * (c) 2019-2024 Richard Tong * rubico may be freely distributed under the MIT license. */ const isArray=Array.isArray,__=Symbol.for("placeholder"),arrayPush=function(t,e){return t.push(e),t},always=t=>function(){return t},curry2ResolveArg0=(t,e)=>function(r){return t(r,e)},curry2ResolveArg1=(t,e)=>function(r){return t(e,r)},curry2=function(t,e,r){return e==__?curry2ResolveArg0(t,r):curry2ResolveArg1(t,e)},getArg1=(t,e)=>e,identity=t=>t,isPromise=t=>null!=t&&"function"==typeof t.then,promiseAll=Promise.all.bind(Promise),funcConcatSync=(t,e)=>function(...r){return e(t(...r))},asyncIteratorForEach=async function(t,e){const r=[];for await(const n of t){const t=e(n);isPromise(t)&&r.push(t)}return 0==r.length?t:promiseAll(r).then(always(t))},symbolIterator=Symbol.iterator,symbolAsyncIterator=Symbol.asyncIterator,arrayFlatten=function(t){const e=t.length,r=[],n=[];let o=-1;for(;++o<e;){const e=t[o];if(isArray(e)){const t=e.length;let r=-1;for(;++r<t;)n.push(e[r])}else if(null==e)n.push(e);else if("function"==typeof e.then)r.push(e.then(curry2(arrayPush,n,__)));else if("function"==typeof e[symbolIterator])for(const t of e)n.push(t);else if("function"==typeof e[symbolAsyncIterator])r.push(asyncIteratorForEach(e[symbolAsyncIterator](),curry2(arrayPush,n,__)));else if("function"==typeof e.chain){const t=e.chain(identity);isPromise(t)?r.push(t.then(curry2(arrayPush,n,__))):n.push(t)}else if("function"==typeof e.flatMap){const t=e.flatMap(identity);isPromise(t)?r.push(t.then(curry2(arrayPush,n,__))):n.push(t)}else if("function"==typeof e.reduce){const t=e.reduce(funcConcatSync(getArg1,curry2(arrayPush,n,__)),null);isPromise(t)&&r.push(t)}else if(e.constructor==Object)for(const t in e)n.push(e[t]);else n.push(e)}return 0==r.length?n:promiseAll(r).then(always(n))},curry3ResolveArg0=(t,e,r)=>function(n){return t(n,e,r)},curry3ResolveArg1=(t,e,r)=>function(n){return t(e,n,r)},curry3ResolveArg2=(t,e,r)=>function(n){return t(e,r,n)},curry3=function(t,e,r,n){return e==__?curry3ResolveArg0(t,r,n):r==__?curry3ResolveArg1(t,e,n):curry3ResolveArg2(t,e,r)},callPropUnary=(t,e,r)=>t[e](r),setFlatten=function(t){t.size;const e=[],r=new Set,n=(t,e)=>r.add(e),o=curry3(callPropUnary,r,"add",__);for(const c of t)if(isArray(c)){const t=c.length;let e=-1;for(;++e<t;)r.add(c[e])}else if(null==c)r.add(c);else if("function"==typeof c[symbolIterator])for(const t of c)r.add(t);else if("function"==typeof c[symbolAsyncIterator])e.push(asyncIteratorForEach(c[symbolAsyncIterator](),o));else if("function"==typeof c.chain){const t=c.chain(identity);isPromise(t)?e.push(t.then(o)):r.add(t)}else if("function"==typeof c.flatMap){const t=c.flatMap(identity);isPromise(t)?e.push(t.then(o)):r.add(t)}else if("function"==typeof c.reduce){const t=c.reduce(n,null);isPromise(t)&&e.push(t)}else if(c.constructor==Object)for(const t in c)r.add(c[t]);else r.add(c);return 0==e.length?r:promiseAll(e).then((()=>r))},objectAssign=Object.assign,objectFlatten=function(t){const e=[],r={},n=curry2(objectAssign,r,__),o=funcConcatSync(getArg1,n);for(const c in t){const s=t[c];if(null!=s)if("function"==typeof s[symbolIterator])for(const t of s)objectAssign(r,t);else if("function"==typeof s[symbolAsyncIterator])e.push(asyncIteratorForEach(s[symbolAsyncIterator](),n));else if("function"==typeof s.chain){const t=s.chain(identity);isPromise(t)?e.push(t.then(n)):objectAssign(r,t)}else if("function"==typeof s.flatMap){const t=s.flatMap(identity);isPromise(t)?e.push(t.then(n)):n(t)}else if("function"==typeof s.reduce){const t=s.reduce(o,null);isPromise(t)&&e.push(t)}else objectAssign(r,s)}return 0==e.length?r:promiseAll(e).then((()=>r))},objectValues=Object.values,objectProto=Object.prototype,nativeObjectToString=objectProto.toString,objectToString=t=>nativeObjectToString.call(t),generatorFunctionTag="[object GeneratorFunction]",isGeneratorFunction=t=>objectToString(t)==generatorFunctionTag,asyncGeneratorFunctionTag="[object AsyncGeneratorFunction]",isAsyncGeneratorFunction=t=>objectToString(t)==asyncGeneratorFunctionTag,iteratorReduceAsync=async function(t,e,r){let n=t.next();if(n.done)return r;for(;!n.done;)r=e(r,n.value),isPromise(r)&&(r=await r),n=t.next();return r},iteratorReduce=function(t,e,r){let n=t.next();if(n.done)return r;for(void 0===r&&(r=n.value,n=t.next());!n.done;){if(r=e(r,n.value),isPromise(r))return r.then(curry3(iteratorReduceAsync,t,e,__));n=t.next()}return r},asyncIteratorReduce=async function(t,e,r){let n=await t.next();if(n.done)return r;for(void 0===r&&(r=n.value,n=await t.next());!n.done;)r=await e(r,n.value),n=await t.next();return r},curryArgs3ResolveArgs0=(t,e,r)=>function(...n){return t(n,e,r)},curryArgs3ResolveArgs1=(t,e,r)=>function(...n){return t(e,n,r)},curryArgs3ResolveArgs2=(t,e,r)=>function(...n){return t(e,r,n)},curryArgs3=function(t,e,r,n){return e==__?curryArgs3ResolveArgs0(t,r,n):r==__?curryArgs3ResolveArgs1(t,e,n):curryArgs3ResolveArgs2(t,e,r)},curry4ResolveArg0=(t,e,r,n)=>function(o){return t(o,e,r,n)},curry4ResolveArg1=(t,e,r,n)=>function(o){return t(e,o,r,n)},curry4ResolveArg2=(t,e,r,n)=>function(o){return t(e,r,o,n)},curry4ResolveArg3=(t,e,r,n)=>function(o){return t(e,r,n,o)},curry4=function(t,e,r,n,o){return e==__?curry4ResolveArg0(t,r,n,o):r==__?curry4ResolveArg1(t,e,n,o):n==__?curry4ResolveArg2(t,e,r,o):curry4ResolveArg3(t,e,r,n)},arrayReduceAsync=async function(t,e,r,n){const o=t.length;for(;++n<o;)r=e(r,t[n],n,t),isPromise(r)&&(r=await r);return r},arrayReduce=function(t,e,r){const n=t.length;let o=-1;for(void 0===r&&(r=t[++o]);++o<n;)if(r=e(r,t[o],o,t),isPromise(r))return r.then(curry4(arrayReduceAsync,t,e,__,o));return r},curry5ResolveArg0=(t,e,r,n,o)=>function(c){return t(c,e,r,n,o)},curry5ResolveArg1=(t,e,r,n,o)=>function(c){return t(e,c,r,n,o)},curry5ResolveArg2=(t,e,r,n,o)=>function(c){return t(e,r,c,n,o)},curry5ResolveArg3=(t,e,r,n,o)=>function(c){return t(e,r,n,c,o)},curry5ResolveArg4=(t,e,r,n,o)=>function(c){return t(e,r,n,o,c)},curry5=function(t,e,r,n,o,c){return e==__?curry5ResolveArg0(t,r,n,o,c):r==__?curry5ResolveArg1(t,e,n,o,c):n==__?curry5ResolveArg2(t,e,r,o,c):o==__?curry5ResolveArg3(t,e,r,n,c):curry5ResolveArg4(t,e,r,n,o)},objectKeys=Object.keys,objectReduceAsync=async function(t,e,r,n,o){const c=n.length;for(;++o<c;){const c=n[o];r=e(r,t[c],c,t),isPromise(r)&&(r=await r)}return r},objectReduce=function(t,e,r){const n=objectKeys(t),o=n.length;let c=-1;for(void 0===r&&(r=t[n[++c]]);++c<o;){const o=n[c];if(r=e(r,t[o],o,t),isPromise(r))return r.then(curry5(objectReduceAsync,t,e,__,n,c))}return r},mapReduceAsync=async function(t,e,r,n){for(const[o,c]of n)r=e(r,c,o,t),isPromise(r)&&(r=await r);return r},mapReduce=function(t,e,r){const n=t.entries();if(void 0===r){const t=n.next();if(t.done)return r;r=t.value[1]}for(const[o,c]of n)if(r=e(r,c,o,t),isPromise(r))return r.then(curry4(mapReduceAsync,t,e,__,n));return r},reducerConcat=(t,e)=>function(r,n){const o=t(r,n);return isPromise(o)?o.then(curry2(e,__,n)):e(o,n)},genericReduce=function(t,e,r){return isArray(t)?arrayReduce(t,e,r):null==t?void 0===r?curry2(e,t,__):e(r,t):t.constructor==Map?mapReduce(t,e,r):"function"==typeof t[symbolIterator]?iteratorReduce(t[symbolIterator](),e,r):"function"==typeof t[symbolAsyncIterator]?asyncIteratorReduce(t[symbolAsyncIterator](),e,r):"function"==typeof t.reduce?t.reduce(e,r):"function"==typeof t.chain?t.chain(curry2(e,r,__)):"function"==typeof t.flatMap?t.flatMap(curry2(e,r,__)):t.constructor==Object?objectReduce(t,e,r):void 0===r?curry2(e,t,__):e(r,t)},FlatMappingIterator=function(t,e){let r=[],n=0;return{[symbolIterator](){return this},next(){if(n<r.length){const t=r[n];return n+=1,{value:t,done:!1}}const o=t.next();if(o.done)return o;const c=genericReduce(e(o.value),arrayPush,[]);return c.length>1&&(r=c,n=1),{value:c[0],done:!1}}}},promiseRace=Promise.race.bind(Promise),sleep=t=>new Promise((e=>{setTimeout(e,t)})),FlatMappingAsyncIterator=function(t,e){const r=[],n=new Set;return{isAsyncIteratorDone:!1,[symbolAsyncIterator](){return this},toString:()=>"[object FlatMappingAsyncIterator]",async next(){for(;!this.isAsyncIteratorDone||r.length>0||n.size>0;){if(!this.isAsyncIteratorDone){const{value:o,done:c}=await t.next();if(c)this.isAsyncIteratorDone=c;else{const t=e(o);if(isPromise(t)){const e=t.then(curry3(genericReduce,__,arrayPush,r)).then((()=>n.delete(e)));n.add(e)}else{const e=genericReduce(t,arrayPush,r);if(isPromise(e)){const t=e.then((()=>n.delete(t)));n.add(t)}}}}if(r.length>0)return{value:r.shift(),done:!1};n.size>0&&await promiseRace([sleep(1e3),...n])}return{value:void 0,done:!0}}}},arrayMap=function(t,e){const r=t.length,n=Array(r);let o=-1,c=!1;for(;++o<r;){const r=e(t[o],o,t);isPromise(r)&&(c=!0),n[o]=r}return c?promiseAll(n):n},arrayFlatMap=function(t,e){const r=arrayMap(t,e);return isPromise(r)?r.then(arrayFlatten):arrayFlatten(r)},promiseObjectAllExecutor=t=>function(e){const r={};let n=0;for(const o in t){const c=t[o];isPromise(c)?(n+=1,c.then((t=>function(o){r[t]=o,n-=1,0==n&&e(r)})(o))):r[o]=c}0==n&&e(r)},promiseObjectAll=t=>new Promise(promiseObjectAllExecutor(t)),objectMap=function(t,e){const r={};let n=!1;for(const o in t){const c=e(t[o],o,t);isPromise(c)&&(n=!0),r[o]=c}return n?promiseObjectAll(r):r},objectFlatMap=function(t,e){const r=objectMap(t,e);return isPromise(r)?r.then(objectFlatten):objectFlatten(r)},setMap=function(t,e){const r=new Set,n=[];for(const o of t){const c=e(o,o,t);isPromise(c)?n.push(c.then(curry3(callPropUnary,r,"add",__))):r.add(c)}return 0==n.length?r:promiseAll(n).then(always(r))},setFlatMap=function(t,e){const r=setMap(t,e);return isPromise(r)?r.then(setFlatten):setFlatten(r)},funcConcat=(t,e)=>function(...r){const n=t(...r);return isPromise(n)?n.then(e):e(n)},arrayJoin=(t,e)=>t.join(e),arrayFlattenToString=funcConcat(arrayFlatten,curry2(arrayJoin,__,"")),stringFlatMap=function(t,e){const r=arrayMap(t,e);return isPromise(r)?r.then(arrayFlattenToString):arrayFlattenToString(r)},_flatMap=function(t,e){if(isArray(t))return arrayFlatMap(t,e);if(null==t)return e(t);if("function"==typeof t.then)return t.then(e);if("function"==typeof t.next)return symbolIterator in t?FlatMappingIterator(t,e):FlatMappingAsyncIterator(t,e);if("function"==typeof t.chain)return t.chain(e);if("function"==typeof t.flatMap)return t.flatMap(e);const r=t.constructor;return r==Object?objectFlatMap(t,e):r==Set?setFlatMap(t,e):"string"==typeof t||r==String?stringFlatMap(t,e):e(t)},flatMap=(t,e)=>"function"==typeof t?curry2(_flatMap,__,t):isPromise(t)?t.then(curry2(_flatMap,__,e)):_flatMap(t,e),flatten=function(t){return isArray(t)?arrayFlatten(t):null==t?t:t.constructor==Set?setFlatten(t):t.constructor==Object?objectFlatten(t):flatMap(t,identity)};export default flatten;