{"version":3,"sources":["asynciterable/operators/intersect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,KAAK,UAAU,WAAW,CACxB,KAAU,EACV,IAAO,EACP,QAAoD,EACpD,MAAoB;IAEpB,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC3D,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE;QACd,OAAO,KAAK,CAAC;KACd;IACD,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACrB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,OAAO,sBAAgC,SAAQ,cAAuB;IAK1E,YACE,KAA6B,EAC7B,MAA8B,EAC9B,QAAgE;QAEhE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAoB;QAChD,MAAM,GAAG,GAAG,EAAe,CAAC;QAC5B,IAAI,KAAK,EAAE,MAAM,UAAU,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;YAClE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;SACtB;QAED,IAAI,KAAK,EAAE,MAAM,SAAS,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;YAChE,IAAI,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE;gBAC7D,MAAM,SAAS,CAAC;aACjB;SACF;IACH,CAAC;CACF;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,SAAS,CACvB,MAA8B,EAC9B,WAAmE,aAAa;IAEhF,OAAO,SAAS,yBAAyB,CACvC,KAA6B;QAE7B,OAAO,IAAI,sBAAsB,CAAU,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtE,CAAC,CAAC;AACJ,CAAC","file":"intersect.js","sourcesContent":["import { AsyncIterableX } from '../asynciterablex';\nimport { arrayIndexOfAsync } from '../../util/arrayindexof';\nimport { comparerAsync } from '../../util/comparer';\nimport { MonoTypeOperatorAsyncFunction } from '../../interfaces';\nimport { wrapWithAbort } from './withabort';\nimport { throwIfAborted } from '../../aborterror';\n\nasync function arrayRemove<T>(\n  array: T[],\n  item: T,\n  comparer: (x: T, y: T) => boolean | Promise<boolean>,\n  signal?: AbortSignal\n): Promise<boolean> {\n  throwIfAborted(signal);\n  const idx = await arrayIndexOfAsync(array, item, comparer);\n  if (idx === -1) {\n    return false;\n  }\n  array.splice(idx, 1);\n  return true;\n}\n\nexport class IntersectAsyncIterable<TSource> extends AsyncIterableX<TSource> {\n  private _first: AsyncIterable<TSource>;\n  private _second: AsyncIterable<TSource>;\n  private _comparer: (x: TSource, y: TSource) => boolean | Promise<boolean>;\n\n  constructor(\n    first: AsyncIterable<TSource>,\n    second: AsyncIterable<TSource>,\n    comparer: (x: TSource, y: TSource) => boolean | Promise<boolean>\n  ) {\n    super();\n    this._first = first;\n    this._second = second;\n    this._comparer = comparer;\n  }\n\n  async *[Symbol.asyncIterator](signal?: AbortSignal) {\n    const map = [] as TSource[];\n    for await (const secondItem of wrapWithAbort(this._second, signal)) {\n      map.push(secondItem);\n    }\n\n    for await (const firstItem of wrapWithAbort(this._first, signal)) {\n      if (await arrayRemove(map, firstItem, this._comparer, signal)) {\n        yield firstItem;\n      }\n    }\n  }\n}\n\n/**\n * Produces the set intersection of two async-iterable sequences.\n *\n * @export\n * @template TSource The type of the elements of the input sequences.\n * @param {AsyncIterable<TSource>} second An async-iterable sequence whose distinct elements that also\n * appear in the first sequence will be returned.\n * @param {((x: TSource, y: TSource) => boolean | Promise<boolean>)} [comparer=comparerAsync] An equality comparer to compare values.\n * @returns {MonoTypeOperatorAsyncFunction<TSource>} An operator that returns a sequence that contains the elements that form the set\n * intersection of two sequences.\n */\nexport function intersect<TSource>(\n  second: AsyncIterable<TSource>,\n  comparer: (x: TSource, y: TSource) => boolean | Promise<boolean> = comparerAsync\n): MonoTypeOperatorAsyncFunction<TSource> {\n  return function intersectOperatorFunction(\n    first: AsyncIterable<TSource>\n  ): AsyncIterableX<TSource> {\n    return new IntersectAsyncIterable<TSource>(first, second, comparer);\n  };\n}\n"]}