{"version":3,"sources":["asynciterable/operators/debounce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,KAAK,UAAU,OAAO,CACpB,MAAwB,EACxB,EAAqC;IAErC,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,MAAM,EAAE;QAC/B,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;KAChB;AACH,CAAC;AAED,MAAM,OAAO,qBAA+B,SAAQ,cAAuB;IAIzE,YAAY,MAA8B,EAAE,IAAY;QACtD,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;QAC3B,IAAI,OAAgB,CAAC;QACrB,IAAI,QAA6B,CAAC;QAClC,IAAI,QAA0B,CAAC;QAC/B,IAAI,QAAsE,CAAC;QAC3E,IAAI,IAAI,GAAY,KAAK,CAAC;QAC1B,IAAI,QAAQ,GAAY,KAAK,CAAC;QAC9B,IAAI,KAAU,CAAC;QAEf,MAAM,KAAK,GAAG,CAAC,UAAmB,EAAE,EAAE;YACpC,OAAO,GAAG,UAAU,CAAC;YACrB,QAAQ,GAAG,SAAS,CAAC;YACrB,QAAQ,GAAG,IAAI,OAAO,CAAU,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC,CAAC;QAEF,MAAM,GAAG,GAAG,GAAG,EAAE;YACf,IAAI,QAAQ,KAAK,SAAS,EAAE;gBAC1B,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO;aACR;YAED,MAAM,IAAI,GAAG,QAAQ,CAAC;YACtB,MAAM,GAAG,GAAG,QAAQ,CAAC;YACrB,KAAK,CAAC,KAAK,CAAC,CAAC;YACb,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5B,GAAG,CAAC,IAAI,CAAC,CAAC;QACZ,CAAC,CAAC;QAEF,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE;YAC3B,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,OAAO,EAAE;gBACX,GAAG,EAAE,CAAC;aACP;QACH,CAAC,CAAC;aACC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;aACzB,KAAK,CAAC,GAAG,CAAC,EAAE;YACX,QAAQ,GAAG,IAAI,CAAC;YAChB,KAAK,GAAG,GAAG,CAAC;QACd,CAAC,CAAC,CAAC;QAEL,OAAO,CAAC,EAAE;YACR,IAAI,IAAI,EAAE;gBACR,MAAM;aACP;YACD,IAAI,QAAQ,EAAE;gBACZ,MAAM,KAAK,CAAC;aACb;YACD,MAAM,MAAM,QAAS,CAAC;SACvB;IACH,CAAC;CACF;AAED,MAAM,UAAU,QAAQ,CAAU,IAAY;IAC5C,OAAO,SAAS,wBAAwB,CACtC,MAA8B;QAE9B,OAAO,IAAI,qBAAqB,CAAU,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1D,CAAC,CAAC;AACJ,CAAC","file":"debounce.js","sourcesContent":["import { AsyncIterableX } from '../asynciterablex';\nimport { MonoTypeOperatorAsyncFunction } from '../../interfaces';\n\nasync function forEach<T>(\n  source: AsyncIterable<T>,\n  fn: (item: T) => void | Promise<void>\n): Promise<void> {\n  for await (const item of source) {\n    await fn(item);\n  }\n}\n\nexport class DebounceAsyncIterable<TSource> extends AsyncIterableX<TSource> {\n  private _source: AsyncIterable<TSource>;\n  private _time: number;\n\n  constructor(source: AsyncIterable<TSource>, time: number) {\n    super();\n    this._source = source;\n    this._time = time;\n  }\n\n  async *[Symbol.asyncIterator]() {\n    let noValue: boolean;\n    let lastItem: TSource | undefined;\n    let deferred: Promise<TSource>;\n    let resolver: (value?: TSource | PromiseLike<TSource> | undefined) => void;\n    let done: boolean = false;\n    let hasError: boolean = false;\n    let error: any;\n\n    const reset = (hasNoValue: boolean) => {\n      noValue = hasNoValue;\n      lastItem = undefined;\n      deferred = new Promise<TSource>(r => (resolver = r));\n    };\n\n    const run = () => {\n      if (lastItem === undefined) {\n        noValue = true;\n        return;\n      }\n\n      const item = lastItem;\n      const res = resolver;\n      reset(false);\n      setTimeout(run, this._time);\n      res(item);\n    };\n\n    reset(true);\n    forEach(this._source, item => {\n      lastItem = item;\n      if (noValue) {\n        run();\n      }\n    })\n      .then(() => (done = true))\n      .catch(err => {\n        hasError = true;\n        error = err;\n      });\n\n    while (1) {\n      if (done) {\n        break;\n      }\n      if (hasError) {\n        throw error;\n      }\n      yield await deferred!;\n    }\n  }\n}\n\nexport function debounce<TSource>(time: number): MonoTypeOperatorAsyncFunction<TSource> {\n  return function debounceOperatorFunction(\n    source: AsyncIterable<TSource>\n  ): AsyncIterableX<TSource> {\n    return new DebounceAsyncIterable<TSource>(source, time);\n  };\n}\n"]}