UNPKG

@reactivex/ix-esnext-esm

Version:

The Interactive Extensions for JavaScript

1 lines 6.63 kB
{"version":3,"sources":["asynciterable/operators/batch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAOlD,MAAM,YAAY,GAAG,SAAS,CAAC;AAC/B,MAAM,aAAa,GAAG,UAAU,CAAC;AAajC,SAAS,WAAW,CAAC,KAAY;IAC/B,MAAM,IAAI,KAAK,CAAC,wCAAwC,KAAK,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,OAAO,kBAA4B,SAAQ,cAAyB;IAGxE,YAAY,MAA8B;QACxC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAoB;QACzC,cAAc,CAAC,MAAM,CAAC,CAAC;QACvB,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;QAEvE,IAAI,KAAK,GAAmB,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAChE,IAAI,KAAK,GAA8C,IAAI,CAAC;QAE5D,SAAS,WAAW;YAClB,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,CACZ,CAAC,GAAG,EAAE,EAAE;gBACN,IAAI,GAAG,CAAC,IAAI,EAAE;oBACZ,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAA+B,CAAC,CAAC;oBAErE,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE;wBAC/B,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;qBAC/B;iBACF;qBAAM;oBACL,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE;wBAC/B,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC;wBACnC,KAAK,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;wBAC5C,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;qBACjD;yBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE;wBACvC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;qBAC9B;yBAAM;wBACL,WAAW,CAAC,KAAK,CAAC,CAAC;qBACpB;oBAED,WAAW,EAAE,CAAC;iBACf;YACH,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;gBACN,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAE5B,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE;oBAC/B,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC;oBAClC,MAAM,CAAC,GAAG,CAAC,CAAC;iBACb;YACH,CAAC,CACF,CAAC;QACJ,CAAC;QAED,WAAW,EAAE,CAAC;QAEd,OAAO;YACL,IAAI;gBACF,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC3D,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;oBACzB,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;oBAClB,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;iBACxD;gBAED,IAAI,KAAK,EAAE;oBACT,OAAO,KAAK,CAAC;iBACd;gBAED,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE;oBAC/B,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;iBAC3D;gBAED,OAAO,IAAI,OAAO,CAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBAChE,KAAK,GAAG;wBACN,IAAI,EAAE,YAAY;wBAClB,QAAQ,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;qBAC9B,CAAC;gBACJ,CAAC,CAAC,CAAC;YACL,CAAC;YAED,MAAM,CAAC,KAAU;gBACf,OAAO,EAAE,CAAC,MAAM;oBACd,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAgC,CAAA,CAAC;oBAC5E,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAA+B,CAAC,CAAC;YACnE,CAAC;SACF,CAAC;IACJ,CAAC;CACF;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,KAAK;IACnB,OAAO,SAAS,aAAa,CAAC,MAA8B;QAC1D,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC,CAAC;AACJ,CAAC","file":"batch.js","sourcesContent":["import { AsyncIterableX } from '../asynciterablex';\nimport { OperatorAsyncFunction } from '../../interfaces';\nimport { wrapWithAbort } from './withabort';\nimport { throwIfAborted } from '../../aborterror';\n\ninterface AsyncResolver<T> {\n resolve: (value?: T | PromiseLike<T> | undefined) => void;\n reject: (reason?: any) => void;\n}\n\nconst WAITING_TYPE = 'waiting';\nconst BATCHING_TYPE = 'batching';\n\ninterface WaitingState<T> {\n type: 'waiting';\n resolver: AsyncResolver<IteratorResult<T[]>>;\n}\ninterface BatchingState<T> {\n type: 'batching';\n values: T[];\n}\n\ntype State<T> = WaitingState<T> | BatchingState<T>;\n\nfunction assertNever(value: never): never {\n throw new Error(`Unhandled discriminated union member ${value}`);\n}\n\nexport class BatchAsyncIterable<TSource> extends AsyncIterableX<TSource[]> {\n private _source: AsyncIterable<TSource>;\n\n constructor(source: AsyncIterable<TSource>) {\n super();\n this._source = source;\n }\n\n [Symbol.asyncIterator](signal?: AbortSignal) {\n throwIfAborted(signal);\n const it = wrapWithAbort(this._source, signal)[Symbol.asyncIterator]();\n\n let state: State<TSource> = { type: BATCHING_TYPE, values: [] };\n let ended: null | Promise<IteratorResult<TSource[]>> = null;\n\n function consumeNext() {\n it.next().then(\n (res) => {\n if (res.done) {\n ended = Promise.resolve({ done: true } as IteratorResult<TSource[]>);\n\n if (state.type === WAITING_TYPE) {\n state.resolver.resolve(ended);\n }\n } else {\n if (state.type === WAITING_TYPE) {\n const { resolve } = state.resolver;\n state = { type: BATCHING_TYPE, values: [] };\n resolve({ done: res.done, value: [res.value] });\n } else if (state.type === BATCHING_TYPE) {\n state.values.push(res.value);\n } else {\n assertNever(state);\n }\n\n consumeNext();\n }\n },\n (err) => {\n ended = Promise.reject(err);\n\n if (state.type === WAITING_TYPE) {\n const { reject } = state.resolver;\n reject(err);\n }\n }\n );\n }\n\n consumeNext();\n\n return {\n next() {\n if (state.type === BATCHING_TYPE && state.values.length > 0) {\n const { values } = state;\n state.values = [];\n return Promise.resolve({ done: false, value: values });\n }\n\n if (ended) {\n return ended;\n }\n\n if (state.type === WAITING_TYPE) {\n throw new Error('Previous `next()` is still in progress');\n }\n\n return new Promise<IteratorResult<TSource[]>>((resolve, reject) => {\n state = {\n type: WAITING_TYPE,\n resolver: { resolve, reject },\n };\n });\n },\n\n return(value: any) {\n return it.return\n ? it.return(value).then(() => ({ done: true } as IteratorResult<TSource[]>))\n : Promise.resolve({ done: true } as IteratorResult<TSource[]>);\n },\n };\n }\n}\n\n/**\nReturns an async iterable sequence of batches that are collected from the source sequence between\n * subsequent `next()` calls.\n *\n * @export\n * @template TSource The type of elements in the source sequence.\n * @returns {OperatorAsyncFunction<TSource, TSource[]>} An operator returning an async-iterable of batches that are collection from the\n * source sequence between subsequent `next()` calls.\n */\nexport function batch<TSource>(): OperatorAsyncFunction<TSource, TSource[]> {\n return function batchOperator(source: AsyncIterable<TSource>): AsyncIterableX<TSource[]> {\n return new BatchAsyncIterable(source);\n };\n}\n"]}