{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-bp2019/src/client/reactive/stream.js"],"names":["aexpr","Stream","constructor","source","_ended","_data","_dataCallbacks","_endCallbacks","_downstream","write","d","push","forEach","cb","stream","end","on","type","callback","pipe","dest","map","fn","newStream","zip","inputStreams","streams","cursor","pushDownstream","every","length","checkEndCondition","minLengthOfEndedStreams","Infinity","Math","min","updateDownstream"],"mappings":";;;;;;AAAOA,W;;;;;;;;;;;;;;;;;;AAEQ,YAAMC,MAAN,CAAa;AAC1BC,oBAAYC,MAAZ,EAAoB;AAClB,eAAKC,MAAL,GAAc,KAAd;AACA,eAAKC,KAAL,GAAa,EAAb;AACA,eAAKC,cAAL,GAAsB,EAAtB;AACA,eAAKC,aAAL,GAAqB,EAArB;AACA,eAAKC,WAAL,GAAmB,EAAnB;;AAEA;AACD;;AAEDC,cAAMC,CAAN,EAAS;AACP,cAAG,KAAKN,MAAR,EAAgB;AAAE;AAAS;;AAE3B,eAAKC,KAAL,CAAWM,IAAX,CAAgBD,CAAhB;AACA,eAAKJ,cAAL,CAAoBM,OAApB,CAA4BC,MAAMA,GAAGH,CAAH,CAAlC;AACA,eAAKF,WAAL,CAAiBI,OAAjB,CAAyBE,UAAUA,OAAOL,KAAP,CAAaC,CAAb,CAAnC;AACD;AACDK,cAAM;AACJ,cAAG,KAAKX,MAAR,EAAgB;AAAE;AAAS;;AAE3B,eAAKA,MAAL,GAAc,IAAd;AACA,eAAKG,aAAL,CAAmBK,OAAnB,CAA2BC,MAAMA,IAAjC;AACA,eAAKL,WAAL,CAAiBI,OAAjB,CAAyBE,UAAUA,OAAOC,GAAP,EAAnC;AACD;;AAED;;;AAGAC,WAAGC,IAAH,EAASC,QAAT,EAAmB;AACjB,cAAGD,SAAS,MAAZ,EAAoB;AAClB,iBAAKX,cAAL,CAAoBK,IAApB,CAAyBO,QAAzB;AACA,iBAAKb,KAAL,CAAWO,OAAX,CAAmBF,KAAKQ,SAASR,CAAT,CAAxB;AACD;AACD,cAAGO,SAAS,KAAZ,EAAmB;AACjB,iBAAKV,aAAL,CAAmBI,IAAnB,CAAwBO,QAAxB;AACA,gBAAG,KAAKd,MAAR,EAAgB;AACdc;AACD;AACF;;AAED,iBAAO,IAAP;AACD;AACDC,aAAKC,IAAL,EAAW;AACT,eAAKZ,WAAL,CAAiBG,IAAjB,CAAsBS,IAAtB;;AAEA,eAAKf,KAAL,CAAWO,OAAX,CAAmBF,KAAKU,KAAKX,KAAL,CAAWC,CAAX,CAAxB;AACA,cAAG,KAAKN,MAAR,EAAgB;AACdgB,iBAAKL,GAAL;AACD;;AAED,iBAAOK,IAAP;AACD;;AAEDC,YAAIC,EAAJ,EAAQ;AACN,gBAAMC,YAAY,IAAItB,MAAJ,EAAlB;;AAEA,eAAKe,EAAL,CAAQ,MAAR,EAAgBN,KAAK;AACnBa,sBAAUd,KAAV,CAAgBa,GAAGZ,CAAH,CAAhB;AACD,WAFD;AAGA,eAAKM,EAAL,CAAQ,KAAR,EAAe,MAAM;AACnBO,sBAAUR,GAAV;AACD,WAFD;;AAIA,iBAAOQ,SAAP;AACD;AACDC,YAAI,GAAGC,YAAP,EAAqB;AACnB,gBAAMF,YAAY,IAAItB,MAAJ,EAAlB;;AAEA,gBAAMyB,UAAU,CAAC,IAAD,EAAO,GAAGD,YAAV,CAAhB;AACA,cAAIE,SAAS,CAAb;;AAEA,mBAASC,cAAT,GAA0B;AACxB,mBAAMF,QAAQG,KAAR,CAAcf,UAAUA,OAAOT,KAAP,CAAayB,MAAb,GAAsBH,MAA9C,CAAN,EAA6D;AAC3DJ,wBAAUd,KAAV,CAAgBiB,QAAQL,GAAR,CAAYP,UAAUA,OAAOT,KAAP,CAAasB,MAAb,CAAtB,CAAhB;AACAA;AACD;AACF;;AAED;AACA,mBAASI,iBAAT,GAA6B;AAC3B,gBAAIC,0BAA0BC,QAA9B;AACAP,oBAAQd,OAAR,CAAgBE,UAAU;AACxB,kBAAGA,OAAOV,MAAV,EAAkB;AAChB4B,0CAA0BE,KAAKC,GAAL,CAASH,uBAAT,EAAkClB,OAAOT,KAAP,CAAayB,MAA/C,CAA1B;AACD;AACF,aAJD;AAKA,gBAAGE,2BAA2BL,MAA9B,EAAsC;AACpCJ,wBAAUR,GAAV;AACD;AACF;;AAED,mBAASqB,gBAAT,GAA4B;AAC1BR;AACAG;AACD;;AAEDL,kBAAQd,OAAR,CAAgBE,UAAUA,OAAOE,EAAP,CAAU,MAAV,EAAkBoB,gBAAlB,CAA1B;AACAV,kBAAQd,OAAR,CAAgBE,UAAUA,OAAOE,EAAP,CAAU,KAAV,EAAiBoB,gBAAjB,CAA1B;;AAEA,iBAAOb,SAAP;AACD;AArGyB;;yBAAPtB,M","file":"stream.js","sourcesContent":["import aexpr from 'active-expression-rewriting';\n\nexport default class Stream {\n  constructor(source) {\n    this._ended = false;\n    this._data = [];\n    this._dataCallbacks = [];\n    this._endCallbacks = [];\n    this._downstream = [];\n    \n    // #TODO: source processing\n  }\n  \n  write(d) {\n    if(this._ended) { return; }\n    \n    this._data.push(d);\n    this._dataCallbacks.forEach(cb => cb(d));\n    this._downstream.forEach(stream => stream.write(d));\n  }\n  end() {\n    if(this._ended) { return; }\n    \n    this._ended = true;\n    this._endCallbacks.forEach(cb => cb());\n    this._downstream.forEach(stream => stream.end());\n  }\n  \n  /**\n   * @param type = {data, end, error}\n   */\n  on(type, callback) {\n    if(type === 'data') {\n      this._dataCallbacks.push(callback);\n      this._data.forEach(d => callback(d));\n    }\n    if(type === 'end') {\n      this._endCallbacks.push(callback);\n      if(this._ended) {\n        callback();\n      }\n    }\n    \n    return this;\n  }\n  pipe(dest) {\n    this._downstream.push(dest)\n    \n    this._data.forEach(d => dest.write(d));\n    if(this._ended) {\n      dest.end();\n    }\n    \n    return dest;\n  }\n  \n  map(fn) {\n    const newStream = new Stream();\n    \n    this.on('data', d => {\n      newStream.write(fn(d));\n    });\n    this.on('end', () => {\n      newStream.end();\n    });\n    \n    return newStream;\n  }\n  zip(...inputStreams) {\n    const newStream = new Stream();\n    \n    const streams = [this, ...inputStreams];\n    let cursor = 0;\n    \n    function pushDownstream() {\n      while(streams.every(stream => stream._data.length > cursor)) {\n        newStream.write(streams.map(stream => stream._data[cursor]));\n        cursor++;\n      }\n    }\n    \n    // should end the newStream when the cursor reaches the minimum data length of any ended input stream\n    function checkEndCondition() {\n      let minLengthOfEndedStreams = Infinity;\n      streams.forEach(stream => {\n        if(stream._ended) {\n          minLengthOfEndedStreams = Math.min(minLengthOfEndedStreams, stream._data.length);\n        }\n      });\n      if(minLengthOfEndedStreams <= cursor) {\n        newStream.end();\n      }\n    }\n\n    function updateDownstream() {\n      pushDownstream();\n      checkEndCondition();\n    }\n    \n    streams.forEach(stream => stream.on('data', updateDownstream));\n    streams.forEach(stream => stream.on('end', updateDownstream));\n    \n    return newStream;\n  }\n}\n"]}