async function _valueAt(index: number, iterable: Iterable | AsyncIterable) { let current = 0; for await (const value of iterable) { if (current == index) return value; current++; } throw new ReferenceError(`Index ${index} not found in iterable`); } export function valueAt(index: number): (iterable: Iterable | AsyncIterable) => T; export function valueAt(index: number, iterable: Iterable | AsyncIterable): Promise; export function valueAt(index: number, iterable?: Iterable | AsyncIterable) { return iterable ? _valueAt(index, iterable) : (curriedIterable: Iterable | AsyncIterable) => _valueAt(index, curriedIterable); } export function firstValue(): (iterable: Iterable | AsyncIterable) => Promise; export function firstValue(iterable: Iterable | AsyncIterable): Promise; export function firstValue(iterable?: Iterable | AsyncIterable) { return iterable ? valueAt(0, iterable) : valueAt(0); } async function _lastValue(iterable: Iterable | AsyncIterable) { let value: T | undefined; let wasEmpty = true; for await (value of iterable) { wasEmpty = false; } if (!wasEmpty && value) { return value; } throw new ReferenceError('Cannot get last value of empty iterable'); } export function lastValue(): (iterable: Iterable | AsyncIterable) => Promise; export function lastValue(iterable: Iterable | AsyncIterable): Promise; export function lastValue(iterable?: Iterable | AsyncIterable) { return iterable ? _lastValue(iterable) : (curriedIterable: Iterable | AsyncIterable) => _lastValue(curriedIterable); }