{"version":3,"sources":["asynciterable/asyncsink.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG,OAAO,CAAC;AAC5B,MAAM,WAAW,GAAG,OAAO,CAAC;AAa5B,MAAM,OAAO,SAAS;IAKpB;QACE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;IACvB,CAAC;IAED,CAAC,MAAM,CAAC,aAAa,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,KAAc;QAClB,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,KAAU;QACd,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3C,CAAC;IAEO,KAAK,CAAC,IAA4B;QACxC,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;SAC5C;QAED,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;YAC9B,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAG,CAAC;YACrD,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE;gBAC7B,MAAM,CAAC,IAAI,CAAC,KAAM,CAAC,CAAC;aACrB;iBAAM;gBACL,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAM,EAAE,CAAC,CAAC;aAC9C;SACF;aAAM;YACL,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACzB;IACH,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAG,CAAC;YACrD,IAAI,IAAI,KAAK,WAAW,EAAE;gBACxB,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;aAC9B;iBAAM;gBACL,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAA6B,CAAC,CAAC;aAC3E;SACF;QAED,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAA6B,CAAC,CAAC;SACnE;QAED,OAAO,IAAI,OAAO,CAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,GAAG;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;YACjC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAA6B,CAAC,CAAC;SAC7E;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;CACF","file":"asyncsink.js","sourcesContent":["const ARRAY_VALUE = 'value';\nconst ARRAY_ERROR = 'error';\n\ninterface AsyncSinkItem<T> {\n  type: string;\n  value?: T;\n  error?: any;\n}\n\ninterface AsyncResolver<T> {\n  resolve: (value?: T | PromiseLike<T> | undefined) => void;\n  reject: (reason?: any) => void;\n}\n\nexport class AsyncSink<TSource> implements AsyncIterableIterator<TSource> {\n  private _ended: boolean;\n  private _values: AsyncSinkItem<TSource>[];\n  private _resolvers: AsyncResolver<IteratorResult<TSource>>[];\n\n  constructor() {\n    this._ended = false;\n    this._values = [];\n    this._resolvers = [];\n  }\n\n  [Symbol.asyncIterator]() {\n    return this;\n  }\n\n  write(value: TSource) {\n    this._push({ type: ARRAY_VALUE, value });\n  }\n\n  error(error: any) {\n    this._push({ type: ARRAY_ERROR, error });\n  }\n\n  private _push(item: AsyncSinkItem<TSource>) {\n    if (this._ended) {\n      throw new Error('AsyncSink already ended');\n    }\n\n    if (this._resolvers.length > 0) {\n      const { resolve, reject } = this._resolvers.shift()!;\n      if (item.type === ARRAY_ERROR) {\n        reject(item.error!);\n      } else {\n        resolve({ done: false, value: item.value! });\n      }\n    } else {\n      this._values.push(item);\n    }\n  }\n\n  next() {\n    if (this._values.length > 0) {\n      const { type, value, error } = this._values.shift()!;\n      if (type === ARRAY_ERROR) {\n        return Promise.reject(error);\n      } else {\n        return Promise.resolve({ done: false, value } as IteratorResult<TSource>);\n      }\n    }\n\n    if (this._ended) {\n      return Promise.resolve({ done: true } as IteratorResult<TSource>);\n    }\n\n    return new Promise<IteratorResult<TSource>>((resolve, reject) => {\n      this._resolvers.push({ resolve, reject });\n    });\n  }\n\n  end() {\n    while (this._resolvers.length > 0) {\n      this._resolvers.shift()!.resolve({ done: true } as IteratorResult<TSource>);\n    }\n    this._ended = true;\n  }\n}\n"]}