import { IterableX } from './iterablex.js'; import { returnIterator } from '../util/returniterator.js'; /** @ignore */ export class CatchIterable extends IterableX { private _source: Iterable>; constructor(source: Iterable>) { super(); this._source = source; } *[Symbol.iterator]() { let error = null; let hasError = false; for (const source of this._source) { const it = source[Symbol.iterator](); error = null; hasError = false; while (1) { let c = {}; try { const { done, value } = it.next(); if (done) { returnIterator(it); break; } c = value; } catch (e) { error = e; hasError = true; returnIterator(it); break; } yield c; } if (!hasError) { break; } } if (hasError) { throw error; } } } /** * Creates a sequence by concatenating source sequences until a source sequence completes successfully. * @param {Iterable>} source Source sequences. * @return {Iterable} Sequence that continues to concatenate source sequences while errors occur. */ export function catchAll(source: Iterable>): IterableX { return new CatchIterable(source); } /** * Creates a sequence by concatenating source sequences until a source sequence completes successfully. * @param {...Iterable} source Sequence that continues to concatenate source sequences while errors occur. * @return {Iterable} Sequence that continues to concatenate source sequences while errors occur. */ export function catchError(...source: Iterable[]): IterableX { return new CatchIterable(source); }