rubico
Version:
[a]synchronous functional programming
8 lines (7 loc) • 2.27 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 isPromise=e=>null!=e&&"function"==typeof e.then,__=Symbol.for("placeholder"),curry2ResolveArg0=(e,r)=>function(o){return e(o,r)},curry2ResolveArg1=(e,r)=>function(o){return e(r,o)},curry2=function(e,r,o){return r==__?curry2ResolveArg0(e,o):curry2ResolveArg1(e,r)},isArray=Array.isArray,objectValues=Object.values,SelfReferencingPromise=function(e){const r=e.then((e=>[e,r]));return r},promiseRace=Promise.race.bind(Promise),asyncArraySome=async function(e,r,o,t){const n=e.length;for(;++o<n;){const n=r(e[o]);if(isPromise(n))t.add(SelfReferencingPromise(n));else if(n)return!0}for(;t.size>0;){const[e,r]=await promiseRace(t);if(t.delete(r),e)return!0}return!1},arraySome=function(e,r){const o=e.length;let t=-1;for(;++t<o;){const o=r(e[t]);if(isPromise(o))return asyncArraySome(e,r,t,new Set([SelfReferencingPromise(o)]));if(o)return!0}return!1},asyncIteratorSome=async function(e,r,o,t=20){let n=e.next();for(isPromise(n)&&(n=await n);!n.done;){if(o.size>=t){const[e,r]=await promiseRace(o);if(o.delete(r),e)return!0}const s=r(n.value);if(isPromise(s))o.add(SelfReferencingPromise(s));else if(s)return!0;n=e.next(),isPromise(n)&&(n=await n)}for(;o.size>0;){const[e,r]=await promiseRace(o);if(o.delete(r),e)return!0}return!1},iteratorSome=function(e,r){for(const o of e){const t=r(o);if(isPromise(t))return asyncIteratorSome(e,r,new Set([SelfReferencingPromise(t)]));if(t)return!0}return!1},reducerAnySync=e=>function(r,o){return!!r||e(o)},reducerSome=e=>function(r,o){return!0===r?r:isPromise(r)?r.then(curry2(reducerAnySync(e),__,o)):!!r||e(o)},symbolIterator=Symbol.iterator,symbolAsyncIterator=Symbol.asyncIterator,_some=function(e,r){return isArray(e)?arraySome(e,r):null==e?r(e):"function"==typeof e[symbolIterator]?iteratorSome(e[symbolIterator](),r):"function"==typeof e[symbolAsyncIterator]?asyncIteratorSome(e[symbolAsyncIterator](),r,new Set):"function"==typeof e.reduce?e.reduce(reducerSome(r),!1):e.constructor==Object?arraySome(objectValues(e),r):r(e)},some=function(e,r){return"function"==typeof e?curry2(_some,__,e):isPromise(e)?e.then(curry2(_some,__,r)):_some(e,r)};export default some;