UNPKG

@fine-js/channels

Version:

Bits of Clojure's `core.async` ported to JS

2 lines (1 loc) 4.85 kB
!function(){"use strict";const e=(e,t,r)=>((e,t,r=e.length)=>Object.defineProperties(e,{name:{value:t},length:{value:r}}))((n=1)=>{const a=r(n),o=a.kind||`${e}(${n})`;return{kind:o,load:a.load,capacity:n,blocking:t,readable:a.readable,writable:a.writable,peek:()=>{if(!a.readable())throw new Error(o+" is empty");return a.peek()},read:()=>{if(!a.readable())throw new Error(o+" is empty");return a.read()},write:e=>{if(!a.writable())throw new Error(o+" is full");a.write(e)},status:()=>({kind:o,load:a.load(),capacity:n,blocking:t,readable:a.readable(),writable:a.writable()})}},e);var t={unbuffered:()=>Object.freeze({kind:"unbuffered()",load:()=>0,capacity:0,blocking:!0,readable:()=>!1,writable:()=>!1,peek:()=>{throw new Error("peeking into unbuffered()")},read:()=>{throw new Error("reading from unbuffered()")},write:()=>{throw new Error("writing to unbuffered()")},status:()=>null}),buffer:e("buffer",!0,e=>{const t=[];return{load:()=>t.length,peek:()=>t[0],read:()=>t.shift(),write:e=>t.push(e),readable:()=>t.length>0,writable:()=>t.length<e}}),dropping:e("dropping",!1,e=>{const t=[];return{load:()=>t.length,peek:()=>t[0],read:()=>t.shift(),write:r=>{e>t.length&&t.push(r)},readable:()=>t.length>0,writable:()=>!0}}),sliding:e("sliding",!1,e=>{const t=[];return{load:()=>t.length,peek:()=>t[0],read:()=>t.shift(),write:r=>{t.push(r)>e&&t.shift()},readable:()=>t.length>0,writable:()=>!0}})},r={};(function(e){const t=Symbol("none"),n="object"==typeof window?(e,...t)=>{setTimeout(e,0,...t)}:e.setImmediate;r={privates:Symbol("channels/private-apis"),badval:e=>null==e,valueError:e=>new TypeError(`Can not put \`${e}\` onto channel`),once:(e,r=!1)=>{let n=t;return(...a)=>{if(n===t)n=e(...a);else if(!0===r)throw new Error(e.name+" called twice");return n}},schedule:n}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{});const{buffer:n,unbuffered:a}=t,{badval:o,valueError:l,once:s,privates:i,schedule:u}=r,{max:c}=Math,d=(()=>{let e=0;return()=>++e===Number.MAX_SAFE_INTEGER?(e=0,1):e})();var f=(e=a())=>{const t="number"==typeof(r=e)?0===r?a():n(r):r;var r;const f=[],p=[];let b=!1;const w=()=>0===p.length&&0===t.load(),h=()=>t.load()+p.length,y=()=>c(0,h()-f.length),g=()=>b||y()>0,m=()=>b||!t.blocking||y()<t.capacity||h()<f.length,k=e=>0!==f.length&&(u(f.shift(),e),!0),v=()=>{if(0===p.length)return!1;const[e,r]=p[0];return!(!k(e)&&!(e=>!!t.writable()&&(t.write(e),!0))(e)||(p.shift(),u(r,!0),0))},E=()=>{t.load()>0&&k(t.peek())&&(t.read(),1)||v()?u(E):b&&w()&&(f.forEach(e=>u(e,null)),f.splice(0,f.length))},j=()=>new Promise(e=>{b&&w()?e(null):(f.push(s(e,!0)),u(E),R())}),P=new Map,R=()=>{for(const e of P.values())e(A)},M=Map.prototype.delete.bind(P),A={put:e=>new Promise((t,r)=>{o(e)?r(l(e)):b?t(!1):(p.push([e,s(t,!0)]),u(E),R())}),take:j,close:s(()=>{b=!0,R(),u(E)}),async*[Symbol.asyncIterator](){for(;;){const e=await j();if(null===e)break;yield e}},[i]:{takeReady:g,putReady:m,subscribe:e=>{const t=Symbol("channels/activity-subscription-token");return P.set(t,e),t},unsubscribe:M,status:(e=[Date.now(),d()])=>({at:e,takes:f.length,puts:p.length,closed:b,drained:w(),unclaimed:y(),takeReady:g(),putReady:m(),buffer:t.status()})}};return A};const{privates:p,badval:b,valueError:w,once:h}=r,{floor:y,random:g}=Math,m=e=>e.close(),k=e=>e instanceof Array?e[0][p].putReady():e[p].takeReady(),v=e=>e instanceof Array?e[0]:e,E=async e=>{const t=e instanceof Array,r=v(e),n=t?r.put:r.take,a=t?[e[1]]:[];return[await n(...a),r]},j=e=>{return e[(t=0,r=e.length-1,t+y(g()*(r-t+1)))];var t,r},P=async(e,t={})=>{const[r,n]=e.reduce(([e,t],r,n)=>((n%2==0?e:t).push(r),[e,t]),[[],[]]),a=new Map,o=r.reduce((e,t,r)=>{const o=(l=t)instanceof Array?l:[l];var l;for(const e of o){const t=v(e);if(a.has(t))throw new TypeError("each channel may only appear once");a.set(t,n[r])}return e.concat(o)},[]),l=await R(o,t),s=l[1]===P.default?t.default:a.get(l[1]);return s instanceof Function?s(...l):s},R=(e,t={})=>{const r=e.find(e=>e instanceof Array&&b(e[1]));return r?Promise.reject(w(r[1])):e.some(k)?E(t.priority?e.find(k):j(e.filter(k))):Object.hasOwnProperty.call(t,"default")?Promise.resolve([t.default,R.default]):new Promise(t=>{const r=new Map,n=new Map,a=h(t,!0),o=e=>{const t=r.get(e);k(t)&&((()=>{for(const[e,t]of n)e[p].unsubscribe(t)})(),E(t).then(a))};for(const t of e){const e=v(t);r.set(e,t),n.set(e,e[p].subscribe(o))}})};R.default=Symbol("channels/alts-default"),P.default=R.default;var M,A={put:(e,t)=>e.put(t),take:e=>e.take(),close:m,alt:P,alts:R,poll:e=>e[p].takeReady()?e.take():Promise.resolve(null),offer:(e,t)=>b(t)?Promise.reject(w(t)):e[p].putReady()?e.put(t):Promise.resolve(!1),timeout:(e=0)=>{const t=f();return setTimeout(m,e,t).unref(),t}};M={chan:f,...A,...t},"object"==typeof window&&(window.finejs=window.finejs||{},window.finejs.channels=M)}();