rafa
Version:
Rafa.js is a Javascript framework for building concurrent applications.
6 lines (5 loc) • 13.3 kB
JavaScript
/** @license
Copyright (c) 2016 James Bishopp. All rights reserved.
This code may only be used under the MIT style license found at https://raw.githubusercontent.com/jamesbishopp/Rafa.js/master/LICENSE
*/
"use strict";!function(){function t(t){for(var n=void 0,e=void 0,r=void 0,i=arguments.length,s=Array(i>1?i-1:0),u=1;i>u;u++)s[u-1]=arguments[u];var o=s.length;for(r=0;o>r;r++){n=s[r];for(e in n)n.hasOwnProperty(e)&&(t[e]=n[e])}return t}function n(n,e,r){t(t(n.prototype,e.prototype||e),r)}function e(){}function r(t){return t}function i(){return this}function s(t,n){this.channel=null,this.child=null,this.destroy=null,this.handler=n||this.identity,this.next=null,this.parent=t||null,this.prev=null,t&&(this.next=t.child,t.child&&(t.child.prev=this),t.child=this)}function u(t){if(this.Stream.call(this),this.mark=0,this.properties=null,this.setter=this.noop,this.value=null,"function"==typeof t){var n=[];this.setter=t,this.util.P=n,this.value=t(),this.util.P=null;for(var e=n.length,r=0,i=void 0;e>r;r++)i=n[r],i.properties||(i.properties=[]),i.properties.push(this)}else this.value=t}function o(){var t=arguments.length<=0||void 0===arguments[0]?100:arguments[0],n=arguments.length<=1||void 0===arguments[1]?!0:arguments[1],e=Math.max(t,0)||100;this.buffer=new Array(e),this.capacity=e,this.length=0,this.overwrite=n,this.start=0}function a(t,n){void 0===t&&(t=0),this.action=n||null,this.buffer=t?this.buffer(t,"rotate"===n):null,this.callback=null}function h(){}function c(){this.complete=!1}function f(t){var n=t&&t.length;return n?(this.array=t,this.idx=0,void(this.len=n)):new c}function l(t,n){this.generate=t,this.stop=n}function v(t){this.value=t}function p(t){this.error=t}function d(t){this.error=t}function g(t){this.value=t,void 0===t&&(this.isValue=!1,this.map=this.contextid)}function m(t){this.done=t||this.noop,this.pending=0}var w={noop:e,identity:r,extend:t,contextid:i,Message:v,ErrorMessage:p,ErrorDoneMessage:d,DoneMessage:g,RingBuffer:o,Channel:a,Enumerator:h,Context:m,Stream:s,Property:u,Future:function(){var t=void 0,n=void 0;this.promise=new Promise(function(e,r){t=e,n=r}),this.resolve=t,this.reject=n},bind:function(t,n){return function(){for(var e=arguments.length,r=new Array(e),i=0;e>i;i++)r[i]=arguments[i];return n.apply(t,r)}},bind00:function(t,n){return function(){return n.call(t)}},bind10:function(t,n){return function(e){return n.call(t,e)}},bind11:function(t,n,e){return function(r){return n.call(t,e,r)}},buffer:function(t,n){return new this.RingBuffer(t,n)},channel:function(t,n){return new this.Channel(t,n)},context:function(t){return new this.Context(t)},defer:function(t){var n=this.channel();return setTimeout(function(){return n.write(new Date)},t),n},doneMessage:function(t){return new this.DoneMessage(t)},errorMessage:function(t){return new this.ErrorMessage(t)},errordoneMessage:function(t){return new this.ErrorDoneMessage(t)},future:function(){return new this.Future},interval:function(t){var n=this.channel(1,"rotate"),e=function(){n.closed()?clearInterval(r):n.write(new Date)},r=setInterval(e,t);return n},message:function(t){return new this.Message(t)},params:function(t){return function(){for(var n=arguments.length,e=new Array(n),r=0;n>r;r++)e[r]=arguments[r];return t(e)}},property:function(t){return new this.Property(t)},slice:function(t,n,e){return Array.prototype.slice.call(t,n,e)},stream:function(){return new this.Stream}};n(s,w,{all:function(t){return new s(this,t)},collect:function(t){return this.all(function(n){return n.collect(t)})},detach:function(){var t=this.prev,n=this.next,e=this.parent,r=this.destroy;t?t.next=n:e&&(e.child=n),n&&(n.prev=t),r&&r()},done:function(t){return this.all(function(n){return n.isDone&&t(n.value),n})},drop:function(t){var n=Math.max(t,0);return this.all(function(e){return n>0&&e.isValue?void n--:(e.isDone&&(n=t),e)})},each:function(t){return this.all(function(n){return n.isValue&&t(n.value),n})},enumerate:function(t){var n=this,e=function(){return t.next(i)},r=function(t){return n.context(!t.isDone&&e)},i=function(t){return n.push(r(t),t)};return e(),this},error:function(t){return this.all(function(n){return n.isError&&t(n.error),n})},filter:function(t){return this.all(function(n){return n.filter(t)})},filterDuplicates:function(){var t=void 0;return this.filter(function(n){var e=n!==t;return e&&(t=n),e})},flatMap:function(t){return this.all(function(n,e){var r=this;return n.isValue?void!function(){var i=r.child;e.wait(),t(n.value).all(function(t,s){i&&(e.wait(),s.wait(),i.push(r.context(function(){s.end(),e.end()}),t.isDone&&!n.isDone?t.toValue():t)),t.isDone&&e.end()})}():n})},fold:function(t,n){var e=t;return this.all(function(t){var r=t;return r.isValue&&(r=r.fold(e,n),e=r.value,r.isDone)?r:void 0})},group:function(){function t(t,n){return function(e,r){var i=String(n(e.value)),s=t[i]||t._;s&&s.push(r,e)}}function n(t,n){return function(){return t[n]=null}}return function(){for(var e=void 0,r=void 0,i=arguments.length,s=Array(i),u=0;i>u;u++)s[u]=arguments[u];var o=s.length,a=s[o-1];"function"==typeof a?o--:a=this.identity;for(var h={_:this.stream()};o--;)r=this.stream(),e=s[o],h[e]=r,r.destroy=n(h,e);return h._.destroy=n(h,"_"),this.all(t(h,a)),h}}(),listener:function(t,n,e){void 0===t&&(t=""),void 0===n&&(n=0);var r=this[t+"Message"]||this.Message,i=this.channel;return i?i.configure(Math.max(n,i.buffer?i.buffer.capacity:0),e):(i=new this.Channel(n,e),this.channel=i,this.enumerate(i)),this.params(function(t){return i.write(new r(t.length>1?t:t[0]))})},map:function(t){return this.all(function(n){return n.map(t)})},merge:function(){function t(t,n){return function(e,r){return e.isDone?--n.active?t.push(r,this.message(e.value)):(n.active=n.streams,t.push(r,e)):t.push(r,e),e}}function n(t){return function(){for(var n=t.length;n--;)t[n].detach()}}return function(){for(var e=arguments.length,r=Array(e),i=0;e>i;i++)r[i]=arguments[i];for(var s=[this].concat(r),u=this.stream(),o={active:s.length},a=t(u,o),h=s.length,c=[],f=0;h>f;f++)c[f]=new this.Stream(s[f],a);return u.destroy=n(c),o.streams=o.active,u}}(),once:function(){return this.all(function(t){return this.detach(),t.toDone()})},push:function(t,n){if(t.wait(),n.value&&n.value.then)t.waitfor(this,n);else{this.next&&this.next.push(t,n);var e=this.handler(n,t);e&&this.child&&this.child.push(t,e)}t.end()},recover:function(t){var n=this;return this.all(function(e){var r=e;return r.isError&&(r=n.message(t(r.error))),r})},reduce:function(t){var n=void 0;return this.all(function(e){var r=e;return!r.isError&&(void 0!==n?(r=r.fold(n,t),n=r.value):n=r.value,r.isDone)?r:void 0})},release:function(){return this.all(function(t){this.push(this.context(),t)})},scan:function(t,n){var e=t;return this.all(function(t){var r=t;return r.isValue&&(r=r.fold(e,n),e=r.value),r})},split:function(t){return this.all(function(n,e){var r=this.child;if(r){if(!n.isValue)return n;for(var i=t(n.value),s=i.length-1,u=0;s>u;u++)r.push(e,this.message(i[u]));r.push(e,n.copy(i[u]))}})},take:function(t){var n=Math.max(t,0);return this.all(function(e){if(e.isValue){if(!(n>0))return;n--}else e.isDone&&(n=t);return e})},toProperty:function(t){var n=this.property(t);return this.all(function(t,e){return n.set(t.value,e)}),n},until:function(t){var n=this.all(function(t){return t.isDone&&(e.detach(),this.detach()),t}),e=t.all(function(t,e){n.push(e,t.toDone())});return n},write:function(t,n){var e=void 0;return e=t instanceof Error?n?this.errordoneMessage(t):this.errorMessage(t):n?this.doneMessage(t):this.message(t),this.push(this.context(),e),this},zip:function(){function t(t,e,r,i){return function(s,u){return n(s,u,t,e,r,i)}}function n(t,n,e,r,i,s){var u=t.Message;if(t.isDone&&e.active--,e.cache[i]||e.pending--,t.isError?r.push(n,new t.ErrorMessage(t.error)):e.cache[i]=t,e.active||(u=t.DoneMessage,e.active=s),!e.pending){for(var o=new Array(s),a=0,h=void 0;s>a;a++)h=e.cache[a],h&&(o[a]=h.value),e.cache[a]=null;e.pending=s,r.push(n,new u(o))}}function e(t){return function(){for(var n=t.length;n--;)t[n].detach()}}return function(){for(var n=arguments.length,r=Array(n),i=0;n>i;i++)r[i]=arguments[i];var s=r.length+1,u=new Array(s),o={active:s,pending:s,cache:new Array(s)},a=this.stream();u[0]=this.all(t(o,a,0,s));for(var h=1;s>h;h++)u[h]=r[h-1].all(t(o,a,h,s));return a.destroy=e(u),a}}()}),n(u,s,{get:function(){var t=this.util.P;return t&&-1===t.indexOf(this)&&t.push(this),this.value},set:function(t,n){var e=this.setter;return e===this.noop?(this.value=t,this.util.propagate(this,n||this.context())):this.value=e(),this},valueOf:function(){return this.get()},util:{P:null,CyclicError:new Error("Cyclic dependency found in Property graph"),propagate:function(t,n){var e=t.properties,r=t.message(t.value);if(e){var i=e.length,s=[],u=void 0,o=void 0;for(this.reset(e),u=0;i>u;u++)this.visit(s,e[u]);for(u=0;i>u;u++)s[u].set();for(t.push(n,r),u=0;i>u;u++)o=s[u],o.push(n,t.message(o.value))}else t.push(n,r)},reset:function(t){if(t)for(var n=t.length,e=0,r=void 0;n>e;e++)r=t[e],r.mark=0,this.reset(r.properties)},visit:function(t,n){if(n.mark<2){n.mark=1;var e=n.properties;if(e)for(var r=e.length,i=void 0,s=0;r>s;s++)if(i=e[s],i.mark){if(1===i.mark)throw this.CyclicError}else this.visit(t,i)}2!==n.mark&&(n.mark=2,t.unshift(n))}}}),n(o,w,{configure:function(t,n){var e=this.length,r=this.buffer,i=this.start,s=this.capacity;if(e>t)throw new Error("Cannot shrink buffer to a capacity less than the current length");if(t&&e){for(var u=new Array(t),o=0;e>o;o++)u[o]=r[i++],i===s&&(i=0);this.buffer=u}else this.buffer=null;return this.start=0,this.length=e,this.capacity=t,void 0!==n&&(this.overwrite=n),this},end:function(){var t=this.capacity,n=this.start+this.length-1;return n>=t&&(n-=t),n},head:function(){return this.length?this.buffer[this.start]:void 0},pop:function(){var t=this.buffer,n=this.length;if(n){var e=this.end(),r=t[e];return t[e]=null,this.length--,r}},push:function(t){var n=this.buffer,e=this.capacity,r=this.start,i=this.length,s=1,u=r+i;if(i===e){if(!this.overwrite)return 0;s++,r++,r>=e&&(r-=e),this.start=r}else this.length=++i;return u>=e&&(u-=e),n[u]=t,s},shift:function(){var t=this.buffer,n=this.capacity,e=this.start,r=this.length;if(r){var i=t[e];return t[e]=null,--r&&(this.start=++e===n?0:e),this.length=r,i}},tail:function(){return this.length?this.buffer[this.end()]:void 0}}),n(a,w,{close:function(){this.buffer=null,this.callback=!0},closed:function(){return null===this.buffer&&this.callback===!0},configure:function(t,n){void 0===t&&(t=0);var e=this.buffer,r="rotate"===n;return e?t>e.capacity&&e.configure(t,r):t&&(this.buffer=new this.RingBuffer(t,r)),this},next:function(t){var n=this;if(this.callback)throw new Error("Callback already defined");this.read(function(e){return t(e&&e.isMessage?e:n.message(e))})},read:function(t){var n=this.buffer,e=0;return this.callback||(n&&n.capacity&&n.length?(t(n.shift()),e=1):(this.callback=t,e=2)),e},write:function(t){var n=this.callback,e=this.buffer,r=0;return n?(this.callback=null,n(t),r=1):e&&e.capacity&&(r=e.push(t),r&&r++),r}}),n(h,w,{CompleteError:new RangeError("Enumerator is complete")}),t(h,{array:function(t){return new f(t)},empty:function(){return new c},until:function(t,n){return new l(t,n)}}),n(c,h,{next:function(t){if(this.complete)throw this.CompleteError;this.complete=!0,t(this.doneMessage())}}),n(f,h,{next:function(t){var n=this.idx,e=this.len,r=this.Message;if(n===e)throw this.CompleteError;var i=this.array[n++];n===e&&(r=this.DoneMessage),this.idx=n,i instanceof Error&&(r=this.ErrorMessage),t(new r(i))}}),n(l,h,{next:function(t){if(!this.generate)throw this.CompleteError;var n=this.generate(),e=this.Message;n===this.stop?(this.generate=null,this.stop=null,e=this.DoneMessage):n instanceof Error&&(e=this.ErrorMessage),t(new e(n))}}),n(v,w,{isMessage:!0,isValue:!0,isError:!1,isDone:!1,collect:function(t){var n=t(this.value);return null!=n?this.copy(n):void 0},copy:function(t){return new this.constructor(t)},filter:function(t){return t(this.value)?this:void 0},fold:function(t,n){return this.copy(n(t,this.value))},map:function(t){return this.copy(t(this.value))},push:function(t,n){t.push(this.context(n),this)},toError:function(){return this.isError?this:this.errorMessage(this.value)},toDone:function(){return this.isDone?this:this.isError?this.errordoneMessage(this.error):this.doneMessage(this.value)},toKind:function(){var t=void 0;return this.isError?t="Error":this.isDone&&(t="Done"),t+"Message"},toString:function(){return"[object "+this.toKind()+"]"},toRepr:function(){return this.toKind()+"("+this.value+")"},toValue:function(){return!this.isValue||this.isDone?this.message(this.value):this}}),n(p,v,{filter:i,isValue:!1,isError:!0,map:i}),n(d,v,{filter:i,isError:!0,isDone:!0,isValue:!1,map:i}),n(g,v,{isDone:!0,filter:function(t){return t(this.value)?this:new g}}),n(m,w,{end:function(){--this.pending||this.done()},reset:function(t){t&&(this.done=t),this.pending=1},wait:function(){this.pending++},waitfor:function(t,n){var e=this;this.pending++;var r=function(n){e.pending--,t.push(e,n)};n.value.then(function(t){return r(n.copy(t))},function(t){return r(e.errorMessage(t))})}}),"function"==typeof define&&define.amd?define(function(){return w}):"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=w),exports.Rafa=w):"object"==typeof window&&(window.Rafa=w)}();