1 | async 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 |
|
10 | export function valueAt<T>(index: number): (iterable: Iterable<T> | AsyncIterable<T>) => T;
|
11 | export function valueAt<T>(index: number, iterable: Iterable<T> | AsyncIterable<T>): Promise<T>;
|
12 | export 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 |
|
18 | export function firstValue<T>(): (iterable: Iterable<T> | AsyncIterable<T>) => Promise<T>;
|
19 | export function firstValue<T>(iterable: Iterable<T> | AsyncIterable<T>): Promise<T>;
|
20 | export function firstValue<T>(iterable?: Iterable<T> | AsyncIterable<T>) {
|
21 | return iterable ? valueAt(0, iterable) : valueAt(0);
|
22 | }
|
23 |
|
24 | async 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 |
|
36 | export function lastValue<T>(): (iterable: Iterable<T> | AsyncIterable<T>) => Promise<T>;
|
37 | export function lastValue<T>(iterable: Iterable<T> | AsyncIterable<T>): Promise<T>;
|
38 | export function lastValue<T>(iterable?: Iterable<T> | AsyncIterable<T>) {
|
39 | return iterable
|
40 | ? _lastValue(iterable)
|
41 | : (curriedIterable: Iterable<T> | AsyncIterable<T>) => _lastValue(curriedIterable);
|
42 | }
|