rubico
Version:
[a]synchronous functional programming
8 lines (7 loc) • 3.13 kB
JavaScript
/**
* 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,isPromise=r=>null!=r&&"function"==typeof r.then,promiseAll=Promise.all.bind(Promise),__=Symbol.for("placeholder"),curry3ResolveArg0=(r,n,t)=>function(e){return r(e,n,t)},curry3ResolveArg1=(r,n,t)=>function(e){return r(n,e,t)},curry3ResolveArg2=(r,n,t)=>function(e){return r(n,t,e)},curry3=function(r,n,t,e){return n==__?curry3ResolveArg0(r,t,e):t==__?curry3ResolveArg1(r,n,e):curry3ResolveArg2(r,n,t)},thunkify2=(r,n,t)=>function(){return r(n,t)},thunkify4=(r,n,t,e,o)=>function(){return r(n,t,e,o)},funcConcatSync=(r,n)=>function(...t){return n(r(...t))},callPropUnary=(r,n,t)=>r[n](t),thunkConditional=(r,n,t)=>r?n():t(),arrayPush=function(r,n){return r.push(n),r},always=r=>function(){return r},curry2ResolveArg0=(r,n)=>function(t){return r(t,n)},curry2ResolveArg1=(r,n)=>function(t){return r(n,t)},curry2=function(r,n,t){return n==__?curry2ResolveArg0(r,t):curry2ResolveArg1(r,n)},getArg1=(r,n)=>n,identity=r=>r,asyncIteratorForEach=async function(r,n){const t=[];for await(const e of r){const r=n(e);isPromise(r)&&t.push(r)}return 0==t.length?r:promiseAll(t).then(always(r))},symbolIterator=Symbol.iterator,symbolAsyncIterator=Symbol.asyncIterator,arrayFlatten=function(r){const n=r.length,t=[],e=[];let o=-1;for(;++o<n;){const n=r[o];if(isArray(n)){const r=n.length;let t=-1;for(;++t<r;)e.push(n[t])}else if(null==n)e.push(n);else if("function"==typeof n.then)t.push(n.then(curry2(arrayPush,e,__)));else if("function"==typeof n[symbolIterator])for(const r of n)e.push(r);else if("function"==typeof n[symbolAsyncIterator])t.push(asyncIteratorForEach(n[symbolAsyncIterator](),curry2(arrayPush,e,__)));else if("function"==typeof n.chain){const r=n.chain(identity);isPromise(r)?t.push(r.then(curry2(arrayPush,e,__))):e.push(r)}else if("function"==typeof n.flatMap){const r=n.flatMap(identity);isPromise(r)?t.push(r.then(curry2(arrayPush,e,__))):e.push(r)}else if("function"==typeof n.reduce){const r=n.reduce(funcConcatSync(getArg1,curry2(arrayPush,e,__)),null);isPromise(r)&&t.push(r)}else if(n.constructor==Object)for(const r in n)e.push(n[r]);else e.push(n)}return 0==t.length?e:promiseAll(t).then(always(e))},noop=function(){},arrayIncludesWith=function(r,n,t){const e=r.length,o=[];let s=-1;for(;++s<e;){const e=t(n,r[s]);if(isPromise(e))o.push(e);else if(e)return!0}return 0!=o.length&&promiseAll(o).then(curry3(callPropUnary,__,"some",Boolean))},arrayUniqWithAsync=async function(r,n,t,e){const o=r.length;for(;++e<o;){const o=r[e],s=arrayIncludesWith(t,o,n);(isPromise(s)?await s:s)||t.push(o)}return t},arrayUniqWith=function(r,n){const t=r.length,e=[];let o=-1;for(;++o<t;){const t=r[o],s=arrayIncludesWith(e,t,n);if(isPromise(s))return s.then(funcConcatSync(curry3(thunkConditional,__,noop,thunkify2(arrayPush,e,t)),thunkify4(arrayUniqWithAsync,r,n,e,o)));s||e.push(t)}return e},unionWith=r=>function(n){if(isArray(n))return arrayUniqWith(arrayFlatten(n),r);throw new TypeError(`${n} is not an Array`)};export default unionWith;