UNPKG

1.7 kBPlain TextView Raw
1async function _valueAt<T>(index: number, iterable: Iterable<T> | AsyncIterable<T>) {
2 let current = 0;
3 for await (const value of iterable) {
4 if (current == index) return value;
5 current++;
6 }
7 throw new ReferenceError(`Index ${index} not found in iterable`);
8}
9
10export function valueAt<T>(index: number): (iterable: Iterable<T> | AsyncIterable<T>) => T;
11export function valueAt<T>(index: number, iterable: Iterable<T> | AsyncIterable<T>): Promise<T>;
12export function valueAt<T>(index: number, iterable?: Iterable<T> | AsyncIterable<T>) {
13 return iterable
14 ? _valueAt(index, iterable)
15 : (curriedIterable: Iterable<T> | AsyncIterable<T>) => _valueAt(index, curriedIterable);
16}
17
18export function firstValue<T>(): (iterable: Iterable<T> | AsyncIterable<T>) => Promise<T>;
19export function firstValue<T>(iterable: Iterable<T> | AsyncIterable<T>): Promise<T>;
20export function firstValue<T>(iterable?: Iterable<T> | AsyncIterable<T>) {
21 return iterable ? valueAt(0, iterable) : valueAt(0);
22}
23
24async function _lastValue<T>(iterable: Iterable<T> | AsyncIterable<T>) {
25 let value: T | undefined;
26 let wasEmpty = true;
27 for await (value of iterable) {
28 wasEmpty = false;
29 }
30 if (!wasEmpty && value) {
31 return value;
32 }
33 throw new ReferenceError('Cannot get last value of empty iterable');
34}
35
36export function lastValue<T>(): (iterable: Iterable<T> | AsyncIterable<T>) => Promise<T>;
37export function lastValue<T>(iterable: Iterable<T> | AsyncIterable<T>): Promise<T>;
38export function lastValue<T>(iterable?: Iterable<T> | AsyncIterable<T>) {
39 return iterable
40 ? _lastValue(iterable)
41 : (curriedIterable: Iterable<T> | AsyncIterable<T>) => _lastValue(curriedIterable);
42}