UNPKG

queueueue

Version:

Convert push-based streams to pull-based async iterables (fork of queueable)

3 lines (2 loc) 6.04 kB
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e||self).queueueue={})}(this,function(e){class t{constructor(){this.promise=void 0,this.promise=new Promise((e,t)=>{this.resolve=t=>(e(t),this.promise),this.reject=e=>(t(e),this.promise)})}}var r=0;function s(e){return"__private_"+r+++"_"+e}function i(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))throw new TypeError("attempted to use private field on non-instance");return e}var n=function(e){var t={exports:{}};return function(e,t){!function(){function t(e,t,r){this.next=r,r&&(r.prev=this),this.prev=t,t&&(t.next=this),this.data=e}function r(){if(!(this instanceof r))return new r;this._head=null,this._tail=null,this.length=0}r.prototype={push:function(e){this._tail=new t(e,this._tail,null),this._head||(this._head=this._tail),this.length++},pop:function(){if(0!==this.length){var e=this._tail;return this._tail=e.prev,e.prev&&(e.prev=this._tail.next=null),this.length--,1===this.length?this._head=this._tail:0===this.length&&(this._head=this._tail=null),e.data}},unshift:function(e){this._head=new t(e,null,this._head),this._tail||(this._tail=this._head),this.length++},shift:function(){if(0!==this.length){var e=this._head;return this._head=e.next,e.next&&(e.next=this._head.prev=null),this.length--,1===this.length?this._tail=this._head:0===this.length&&(this._head=this._tail=null),e.data}},item:function(e){e<0&&(e=this.length+e);for(var t=this._head;e-- >0&&t;)t=t.next;return t?t.data:void 0},slice:function(e,t){if(e||(e=0),t||(t=this.length),t<0&&(t=this.length+t),e<0&&(e=this.length+e),t===e)return[];if(t<e)throw new Error("invalid offset: "+e+","+t+" (length="+this.length+")");for(var r=t-e,s=new Array(r),i=0,n=this._head;e-- >0&&n;)n=n.next;for(;i<r&&n;)s[i++]=n.data,n=n.next;return s},drop:function(){r.call(this)},forEach:function(e,t){for(var r=this._head,s=0,i=this.length;s<i&&r;)e.call(t||this,r.data,s,this),r=r.next,s++},map:function(e,t){var s=new r;return this.forEach(function(r,i,n){s.push(e.call(t||n,r,i,n))}),s},filter:function(e,t){var s=new r;return this.forEach(function(r,i,n){e.call(t||n,r,i,n)&&s.push(r)}),s},reduce:function(e,t,r){var s=0,i=this._head,n=this.length;for(t||(s=1,t=i&&i.data,i=i&&i.next);s<n&&i;)t=e.call(r||this,t,i.data,this),s++,i=i.next;return t}},e.exports=r}()}(t),t.exports}();let h;var o=/*#__PURE__*/s("list"),u=/*#__PURE__*/s("reversed");h=Symbol.iterator;class l{constructor(e=Infinity){this.limit=void 0,Object.defineProperty(this,o,{writable:!0,value:void 0}),Object.defineProperty(this,u,{writable:!0,value:!1}),this.length=0,this.limit=e,i(this,o)[o]=new n}enqueue(e){const t=i(this,o)[o];t.length===this.limit?t.shift():this.length+=1,t.push(e)}dequeue(){if(0===this.length)throw Error("Buffer is empty");return this.length-=1,i(this,u)[u]?i(this,o)[o].pop():i(this,o)[o].shift()}clear(){this.length=0,i(this,o)[o].drop()}forEach(e){i(this,o)[o].forEach(e)}reverse(){return i(this,u)[u]=!0,this}[h](){return{next:()=>this.length>0?{value:this.dequeue(),done:!1}:{done:!0,value:void 0},[Symbol.iterator](){return this}}}static from(e,t){const r=new l(t);for(const t of e)r.enqueue(t);return r}}const a=Object.freeze({value:void 0,done:!0});Promise.resolve(a);const f=e=>(t,r,s)=>{const i=e(),n=e=>{i.push(e)};return r.addEventListener(t,n,s),i.wrap(()=>r.removeEventListener(t,n,s))},c=e=>(t,r)=>{const s=e(),i=e=>{s.push(e)};return r.addListener(t,i),s.wrap(()=>{r.removeListener(t,i)})};let d,p,v;d=Symbol.asyncIterator;class m{constructor(e=Infinity){this.pushBuffer=void 0,this.pullBuffer=void 0,this.closed=!1,this.pushBuffer=new l(e),this.pullBuffer=new l(e)}next(){if(this.closed)return Promise.resolve(a);if(0===this.pushBuffer.length){const e=new t;return this.pullBuffer.enqueue(e),e.promise}const{result:e,defer:r}=this.pushBuffer.dequeue();return r.resolve(e),e.done&&this.close(),r.promise}push(e,r=!1){if(this.closed)return Promise.resolve(a);const s={value:e,done:r};if(this.pullBuffer.length>0)return this.pullBuffer.dequeue().resolve(s);const i=new t;return this.pushBuffer.enqueue({result:s,defer:i}),i.promise}[d](){return this}return(e){try{return this.close(),Promise.resolve({done:!0,value:e})}catch(e){return Promise.reject(e)}}close(){this.closed||(this.closed=!0,this.pushBuffer.forEach(({defer:{resolve:e}})=>{e(a)}),this.pushBuffer.clear(),this.pullBuffer.forEach(({resolve:e})=>{e(a)}),this.pullBuffer.clear())}wrap(e){const t=this;if(this.closed)throw Error("Balancer is closed");return{[Symbol.asyncIterator](){return this},next:()=>this.next(),return:function(r){try{return e&&e(),Promise.resolve(t.return(r))}catch(e){return Promise.reject(e)}}}}}m.fromDom=f(()=>new m),m.fromEmitter=c(()=>new m),p=Symbol.asyncIterator,v=Symbol.asyncIterator;class w{constructor(){this.buffer=new t,this.closed=!1,this.resolved=!1,this.requested=!1}push(e,r=!1){if(this.closed)throw Error("Iterator closed");const s={value:e,done:r};return!1===this.resolved?this.resolved=!0:(this.buffer=new t,this.resolved=!1),this.requested=!1,this.buffer.resolve(s),this.buffer.promise}next(){try{const e=this;return e.closed?Promise.resolve(a):(e.requested=!0,Promise.resolve(e.buffer.promise))}catch(e){return Promise.reject(e)}}return(e){try{const t=this;return t.closed=!0,!t.resolved&&t.requested&&t.buffer.resolve(a),Promise.resolve({value:e,done:!0})}catch(e){return Promise.reject(e)}}wrap(e){return{next:()=>this.next(),[Symbol.asyncIterator](){return this},return:t=>(e&&e(),this.return(t))}}[v](){return this}}w.fromDom=f(()=>new w),w.fromEmitter=c(()=>new w),e.Buffer=l,e.Channel=m,e.Deferred=t,e.LastResult=w,e.Multicast=class{constructor(e=(()=>new m)){this.init=void 0,this.receivers=new Set,this.init=e}push(e){return this.receivers.forEach(t=>t.push(e)),this}[p](){const e=this.init(),{receivers:t}=this;return t.add(e),this.onStart&&1===t.size&&this.onStart(),e.wrap(()=>{t.delete(e),this.onStop&&0===t.size&&this.onStop()})}},e.fromDom=f,e.fromEmitter=c}); //# sourceMappingURL=queueable.umd.js.map