if(Symbol["asyncIterator"] === undefined) ((Symbol)["asyncIterator"]) = Symbol.for("asyncIterator"); export default function (source: Iterable): Iterable; export default function (source: AsyncIterable): AsyncIterable; export default function ( source: AsyncIterable | Iterable): AsyncIterable | Iterable { if (source[Symbol.asyncIterator]) { return { [Symbol.asyncIterator]() { const it = source[Symbol.asyncIterator](); const $return = it.return; it.return = function (value) { it.next(Symbol.for("terminated")); return $return.call(it) }; return it; } } } else if (source[Symbol.iterator]) { return { [Symbol.iterator]() { const it = source[Symbol.iterator](); const $return = it.return; it.return = function (value) { it.next(Symbol.for("terminated")); return $return.call(it); }; return it; } } } throw Error("source is not iterable!"); }