rubico
Version:
[a]synchronous functional programming
8 lines (7 loc) • 2.43 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 promiseAll=Promise.all.bind(Promise),isArray=Array.isArray,isPromise=r=>null!=r&&"function"==typeof r.then,areAnyValuesPromises=function(r){if(isArray(r)){const n=r.length;let t=-1;for(;++t<n;){const n=r[t];if(isPromise(n))return!0}return!1}for(const n in r){const t=r[n];if(isPromise(t))return!0}return!1},thunkConditional=(r,n,t)=>r?n():t(),thunkifyArgs=(r,n)=>function(){return r(...n)},thunkify3=(r,n,t,o)=>function(){return r(n,t,o)},__=Symbol.for("placeholder"),curry3ResolveArg0=(r,n,t)=>function(o){return r(o,n,t)},curry3ResolveArg1=(r,n,t)=>function(o){return r(n,o,t)},curry3ResolveArg2=(r,n,t)=>function(o){return r(n,t,o)},curry3=function(r,n,t,o){return n==__?curry3ResolveArg0(r,t,o):t==__?curry3ResolveArg1(r,n,o):curry3ResolveArg2(r,n,t)},always=r=>function(){return r},arrayConditional=function(r,n,t){const o=r.length-1;for(;(t+=2)<o;){const o=r[t],e=r[t+1],i="function"==typeof o?o(...n):o;if(isPromise(i))return i.then(curry3(thunkConditional,__,"function"==typeof e?thunkifyArgs(e,n):always(e),thunkify3(arrayConditional,r,n,t)));if(i)return"function"==typeof e?e(...n):e}if(t==r.length)return;const e=r[o];return"function"==typeof e?e(...n):e},areAllValuesNonfunctions=function(r){if(isArray(r)){const n=r.length;let t=-1;for(;++t<n;)if("function"==typeof r[t])return!1;return!0}for(const n in r)if("function"==typeof r[n])return!1;return!0},thunkify2=(r,n,t)=>function(){return r(n,t)},nonfunctionsConditional=function(r,n){const t=r.length,o=t-1;for(;(n+=2)<o;){const t=r[n],o=r[n+1];if(isPromise(t))return t.then(curry3(thunkConditional,__,always(o),thunkify2(nonfunctionsConditional,r,n)));if(t)return o}if(n!=t)return r[n]},curryArgs3ResolveArgs0=(r,n,t)=>function(...o){return r(o,n,t)},curryArgs3ResolveArgs1=(r,n,t)=>function(...o){return r(n,o,t)},curryArgs3ResolveArgs2=(r,n,t)=>function(...o){return r(n,t,o)},curryArgs3=function(r,n,t,o){return n==__?curryArgs3ResolveArgs0(r,t,o):t==__?curryArgs3ResolveArgs1(r,n,o):curryArgs3ResolveArgs2(r,n,t)},switchCase=(...r)=>{const n=r.pop();return areAllValuesNonfunctions(n)?nonfunctionsConditional(n,-2):0==r.length?curryArgs3(arrayConditional,n,__,-2):areAnyValuesPromises(r)?promiseAll(r).then(curry3(arrayConditional,n,__,-2)):arrayConditional(n,r,-2)};export default switchCase;