{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-core/src/client/reactive/stream.js"],"names":["aexpr","GeneratorFunction","Object","getPrototypeOf","constructor","AsyncGeneratorFunction","Stream","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","from","thing","args","item","asAsyncGenerator","that","currentItemIndex","gotNewValue","waitForValue","resetWaitForValue","Promise","resolve","signalEnd","waitForEnd","temp","genFunc","done","race","then","transform","i"],"mappings":"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","file":"stream.js","sourcesContent":["import aexpr from 'active-expression-rewriting';\n\nconst GeneratorFunction = Object.getPrototypeOf(function*(){}).constructor\nconst AsyncGeneratorFunction = Object.getPrototypeOf(async function*(){}).constructor\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  static from(thing, ...args) {\n    const newStream = new Stream();\n\n    if (thing instanceof GeneratorFunction) {\n      for (let item of thing()) {\n        newStream.write(item);\n      }\n      newStream.end();\n    } else if (thing instanceof AsyncGeneratorFunction) {\n      (async () => {\n        for await (let item of thing()) {\n          newStream.write(item);\n        }\n        newStream.end();\n      })();\n    }\n\n    return newStream;\n  }\n  \n  asAsyncGenerator() {\n    const that = this;\n    let currentItemIndex = 0;\n    \n    let gotNewValue;\n    let waitForValue;\n    function resetWaitForValue() {\n      waitForValue = new Promise(resolve => {\n        gotNewValue = resolve;\n      });\n    }\n    resetWaitForValue();\n\n    let signalEnd;\n    const waitForEnd = new Promise(resolve => {\n      signalEnd = resolve;\n    })\n    \n    this.on('data', () => {\n      const temp = gotNewValue;\n      resetWaitForValue();\n      temp();\n    });\n    this.on('end', () => {\n      signalEnd()\n    });\n\n    async function* genFunc() {\n\n      while (true) {\n        while (that._data.length > currentItemIndex) {\n          yield that._data[currentItemIndex++];\n        } \n        \n        const done = await Promise.race([waitForValue.then(() => false), waitForEnd.then(() => true)]);\n        if (done) {\n          return;\n        }\n      }\n    }\n    \n    return genFunc();\n  }\n  \n  transform(genFunc) {\n    const that = this;\n    const newStream = new Stream();\n\n    (async function() {\n      for await (let i of genFunc(that.asAsyncGenerator())) {\n        newStream.write(i);\n      }\n      newStream.end();\n    })()\n    \n    return newStream;\n  }\n  \n}\n"]}