{
  "version": 3,
  "sources": ["../src/merge.ts"],
  "sourcesContent": ["import { queuelessPushable, type Pushable } from './queueless-pushable.js'\n\n/**\n * @packageDocumentation\n *\n * Merge several (async)iterables into one, yield values as they arrive.\n *\n * Nb. sources are iterated over in parallel so the order of emitted items is not guaranteed.\n *\n * @example\n *\n * ```javascript\n * import merge from 'it-merge'\n * import all from 'it-all'\n *\n * // This can also be an iterator, generator, etc\n * const values1 = [0, 1, 2, 3, 4]\n * const values2 = [5, 6, 7, 8, 9]\n *\n * const arr = all(merge(values1, values2))\n *\n * console.info(arr) // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9\n * ```\n *\n * Async sources must be awaited:\n *\n * ```javascript\n * import merge from 'it-merge'\n * import all from 'it-all'\n *\n * // This can also be an iterator, async iterator, generator, etc\n * const values1 = async function * () {\n *   yield * [0, 1, 2, 3, 4]\n * }\n * const values2 = async function * () {\n *   yield * [5, 6, 7, 8, 9]\n * }\n *\n * const arr = await all(merge(values1(), values2()))\n *\n * console.info(arr) // 0, 1, 5, 6, 2, 3, 4, 7, 8, 9  <- nb. order is not guaranteed\n * ```\n */\n\nfunction isAsyncIterable <T> (thing:any):thing is AsyncIterable<T> {\n    return thing[Symbol.asyncIterator] != null\n}\n\nasync function addAllToPushable <T> (sources:Array<AsyncIterable<T> | Iterable<T>>, output:Pushable<T>, signal:AbortSignal):Promise<void> {\n    try {\n        await Promise.all(\n            sources.map(async (source) => {\n                for await (const item of source) {\n                    await output.push(item, {\n                        signal\n                    })\n                    signal.throwIfAborted()\n                }\n            })\n        )\n\n        await output.end(undefined, {\n            signal\n        })\n    } catch (err:any) {\n        await output.end(err, {\n            signal\n        })\n            .catch(() => {})\n    }\n}\n\nasync function * mergeSources <T> (sources:Array<AsyncIterable<T> | Iterable<T>>):AsyncGenerator<T, void, undefined> {\n    const controller = new AbortController()\n    const output = queuelessPushable<T>()\n\n    addAllToPushable(sources, output, controller.signal)\n        .catch(() => {})\n\n    try {\n        yield * output\n    } finally {\n        controller.abort()\n    }\n}\n\nfunction * mergeSyncSources <T> (syncSources:Array<Iterable<T>>):Generator<T, void, undefined> {\n    for (const source of syncSources) {\n        yield * source\n    }\n}\n\n/**\n * Treat one or more iterables as a single iterable.\n *\n * Nb. sources are iterated over in parallel so the\n * order of emitted items is not guaranteed.\n */\nfunction merge <T> (...sources:Array<Iterable<T>>):Generator<T, void, undefined>\nfunction merge <T> (...sources:Array<AsyncIterable<T> | Iterable<T>>):AsyncGenerator<T, void, undefined>\nfunction merge <T> (...sources:Array<AsyncIterable<T> | Iterable<T>>):AsyncGenerator<T, void, undefined> | Generator<T, void, undefined> {\n    const syncSources:Array<Iterable<T>> = []\n\n    for (const source of sources) {\n        if (!isAsyncIterable(source)) {\n            syncSources.push(source)\n        }\n    }\n\n    if (syncSources.length === sources.length) {\n    // all sources are synchronous\n        return mergeSyncSources(syncSources)\n    }\n\n    return mergeSources(sources)\n}\n\nexport default merge\n"],
  "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAAiD;AA4CjD,SAAS,gBAAqB,OAAqC;AAC/D,SAAO,MAAM,OAAO,aAAa,KAAK;AAC1C;AAFS;AAIT,eAAe,iBAAsB,SAA+C,QAAoB,QAAkC;AACtI,MAAI;AACA,UAAM,QAAQ;AAAA,MACV,QAAQ,IAAI,OAAO,WAAW;AAC1B,yBAAiB,QAAQ,QAAQ;AAC7B,gBAAM,OAAO,KAAK,MAAM;AAAA,YACpB;AAAA,UACJ,CAAC;AACD,iBAAO,eAAe;AAAA,QAC1B;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,UAAM,OAAO,IAAI,QAAW;AAAA,MACxB;AAAA,IACJ,CAAC;AAAA,EACL,SAAS,KAAS;AACd,UAAM,OAAO,IAAI,KAAK;AAAA,MAClB;AAAA,IACJ,CAAC,EACI,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACvB;AACJ;AAtBe;AAwBf,gBAAiB,aAAkB,SAAkF;AACjH,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,aAAS,6CAAqB;AAEpC,mBAAiB,SAAS,QAAQ,WAAW,MAAM,EAC9C,MAAM,MAAM;AAAA,EAAC,CAAC;AAEnB,MAAI;AACA,WAAQ;AAAA,EACZ,UAAE;AACE,eAAW,MAAM;AAAA,EACrB;AACJ;AAZiB;AAcjB,UAAW,iBAAsB,aAA8D;AAC3F,aAAW,UAAU,aAAa;AAC9B,WAAQ;AAAA,EACZ;AACJ;AAJW;AAcX,SAAS,SAAc,SAAkH;AACrI,QAAM,cAAiC,CAAC;AAExC,aAAW,UAAU,SAAS;AAC1B,QAAI,CAAC,gBAAgB,MAAM,GAAG;AAC1B,kBAAY,KAAK,MAAM;AAAA,IAC3B;AAAA,EACJ;AAEA,MAAI,YAAY,WAAW,QAAQ,QAAQ;AAEvC,WAAO,iBAAiB,WAAW;AAAA,EACvC;AAEA,SAAO,aAAa,OAAO;AAC/B;AAfS;AAiBT,IAAO,gBAAQ;",
  "names": []
}
