@szilanor/stream
Version:
Typesafe API for processing iterable data in TypeScript and JavaScript
1,051 lines (942 loc) • 59.1 kB
text/typescript
type OperationFunction<TInput, TOutput> = (iterable: Iterable<TInput>) => Iterable<TOutput>;
type AsyncOperationFunction<TInput, TOutput> = (iterable: AsyncIterable<TInput>) => AsyncIterable<TOutput>;
type CollectorFunction<TInput, TOutput> = (iterable: Iterable<TInput>) => TOutput;
type AsyncCollectorFunction<TInput, TOutput> = (iterable: AsyncIterable<TInput>) => PromiseLike<TOutput>;
/** Wrapper class to extend the functionality of an Iterable */
declare class AsyncStream<T> implements AsyncIterable<T> {
private readonly asyncIterable;
[Symbol.asyncIterator](): AsyncIterator<T>;
constructor(asyncIterable?: AsyncIterable<T> | null);
/** Calls a collector function on the Iterable */
collectAsync<O>(collector: AsyncCollectorFunction<T, O>): PromiseLike<O>;
/** Calls an operation function on the Iterable then returns the result as a Stream
* allowing to chain it with more Stream related methods. */
pipeAsync(): AsyncStream<T>;
pipeAsync<A>(op1: AsyncOperationFunction<T, A>): AsyncStream<A>;
pipeAsync<A, B>(op1: AsyncOperationFunction<T, A>, op2: AsyncOperationFunction<A, B>): AsyncStream<B>;
pipeAsync<A, B, C>(op1: AsyncOperationFunction<T, A>, op2: AsyncOperationFunction<A, B>, op3: AsyncOperationFunction<B, C>): AsyncStream<C>;
pipeAsync<A, B, C, D>(op1: AsyncOperationFunction<T, A>, op2: AsyncOperationFunction<A, B>, op3: AsyncOperationFunction<B, C>, op4: AsyncOperationFunction<C, D>): AsyncStream<D>;
pipeAsync<A, B, C, D, E>(op1: AsyncOperationFunction<T, A>, op2: AsyncOperationFunction<A, B>, op3: AsyncOperationFunction<B, C>, op4: AsyncOperationFunction<C, D>, op5: AsyncOperationFunction<D, E>): AsyncStream<E>;
pipeAsync<A, B, C, D, E, F>(op1: AsyncOperationFunction<T, A>, op2: AsyncOperationFunction<A, B>, op3: AsyncOperationFunction<B, C>, op4: AsyncOperationFunction<C, D>, op5: AsyncOperationFunction<D, E>, op6: AsyncOperationFunction<E, F>): AsyncStream<F>;
pipeAsync<A, B, C, D, E, F, G>(op1: AsyncOperationFunction<T, A>, op2: AsyncOperationFunction<A, B>, op3: AsyncOperationFunction<B, C>, op4: AsyncOperationFunction<C, D>, op5: AsyncOperationFunction<D, E>, op6: AsyncOperationFunction<E, F>, op7: AsyncOperationFunction<F, G>): AsyncStream<G>;
pipeAsync<A, B, C, D, E, F, G, H>(op1: AsyncOperationFunction<T, A>, op2: AsyncOperationFunction<A, B>, op3: AsyncOperationFunction<B, C>, op4: AsyncOperationFunction<C, D>, op5: AsyncOperationFunction<D, E>, op6: AsyncOperationFunction<E, F>, op7: AsyncOperationFunction<F, G>, op8: AsyncOperationFunction<G, H>): AsyncStream<H>;
pipeAsync<A, B, C, D, E, F, G, H, I>(op1: AsyncOperationFunction<T, A>, op2: AsyncOperationFunction<A, B>, op3: AsyncOperationFunction<B, C>, op4: AsyncOperationFunction<C, D>, op5: AsyncOperationFunction<D, E>, op6: AsyncOperationFunction<E, F>, op7: AsyncOperationFunction<F, G>, op8: AsyncOperationFunction<G, H>, op9: AsyncOperationFunction<H, I>): AsyncStream<H>;
pipeAsync<A, B, C, D, E, F, G, H, I>(op1: AsyncOperationFunction<T, A>, op2: AsyncOperationFunction<A, B>, op3: AsyncOperationFunction<B, C>, op4: AsyncOperationFunction<C, D>, op5: AsyncOperationFunction<D, E>, op6: AsyncOperationFunction<E, F>, op7: AsyncOperationFunction<F, G>, op8: AsyncOperationFunction<G, H>, op9: AsyncOperationFunction<H, I>): AsyncStream<I>;
pipeAsync(...ops: AsyncOperationFunction<T, T>[]): AsyncStream<T>;
}
/** Wrapper class to extend the functionality of an Iterable */
declare class Stream<T> extends AsyncStream<T> implements Iterable<T> {
private readonly iterable;
constructor(iterable?: Iterable<T> | null);
[Symbol.iterator](): Iterator<T>;
[Symbol.asyncIterator](): AsyncIterator<T>;
/** Calls a collector function on the Iterable */
collect<O>(collector: CollectorFunction<T, O>): O;
/** Calls an operation function on the Iterable then returns the result as a Stream
* allowing to chain it with more Stream related methods. */
pipe(): Stream<T>;
pipe<A>(op1: OperationFunction<T, A>): Stream<A>;
pipe<A, B>(op1: OperationFunction<T, A>, op2: OperationFunction<A, B>): Stream<B>;
pipe<A, B, C>(op1: OperationFunction<T, A>, op2: OperationFunction<A, B>, op3: OperationFunction<B, C>): Stream<C>;
pipe<A, B, C, D>(op1: OperationFunction<T, A>, op2: OperationFunction<A, B>, op3: OperationFunction<B, C>, op4: OperationFunction<C, D>): Stream<D>;
pipe<A, B, C, D, E>(op1: OperationFunction<T, A>, op2: OperationFunction<A, B>, op3: OperationFunction<B, C>, op4: OperationFunction<C, D>, op5: OperationFunction<D, E>): Stream<E>;
pipe<A, B, C, D, E, F>(op1: OperationFunction<T, A>, op2: OperationFunction<A, B>, op3: OperationFunction<B, C>, op4: OperationFunction<C, D>, op5: OperationFunction<D, E>, op6: OperationFunction<E, F>): Stream<F>;
pipe<A, B, C, D, E, F, G>(op1: OperationFunction<T, A>, op2: OperationFunction<A, B>, op3: OperationFunction<B, C>, op4: OperationFunction<C, D>, op5: OperationFunction<D, E>, op6: OperationFunction<E, F>, op7: OperationFunction<F, G>): Stream<G>;
pipe<A, B, C, D, E, F, G, H>(op1: OperationFunction<T, A>, op2: OperationFunction<A, B>, op3: OperationFunction<B, C>, op4: OperationFunction<C, D>, op5: OperationFunction<D, E>, op6: OperationFunction<E, F>, op7: OperationFunction<F, G>, op8: OperationFunction<G, H>): Stream<H>;
pipe<A, B, C, D, E, F, G, H, I>(op1: OperationFunction<T, A>, op2: OperationFunction<A, B>, op3: OperationFunction<B, C>, op4: OperationFunction<C, D>, op5: OperationFunction<D, E>, op6: OperationFunction<E, F>, op7: OperationFunction<F, G>, op8: OperationFunction<G, H>, op9: OperationFunction<H, I>): Stream<H>;
pipe<A, B, C, D, E, F, G, H, I>(op1: OperationFunction<T, A>, op2: OperationFunction<A, B>, op3: OperationFunction<B, C>, op4: OperationFunction<C, D>, op5: OperationFunction<D, E>, op6: OperationFunction<E, F>, op7: OperationFunction<F, G>, op8: OperationFunction<G, H>, op9: OperationFunction<H, I>): Stream<I>;
pipe(...ops: OperationFunction<T, T>[]): Stream<T>;
}
/**
* Returns a Stream that yields elements of all Iterable parameters in order.
* @param iterables Iterables to concatenate.
* @typeParam T Type of items in the Iterables.
* @returns Stream that yields elements of all Iterables in order.
*/
declare function concat<T>(...iterables: Array<Iterable<T>>): Stream<T>;
declare const chain: typeof concat;
/**
* Returns a Stream that yields elements of all Iterable parameters in order.
*/
declare function concatAsync<T>(...iterables: Array<Iterable<T> | AsyncIterable<T>>): AsyncStream<T>;
declare const chainAsync: typeof concatAsync;
/**
* Returns a Stream that infinitely yields elements of the Iterable parameter.
*/
declare function cycle<T>(iterable: Iterable<T>): Stream<T>;
/**
* Returns a Stream that is empty.
* @typeParam T Type of items in the Stream.
* @returns Stream that is empty.
*
* @example
* ```typescript
* const result = empty();
* console.log([...result]); // []
* ```
*/
declare function empty<T>(): Stream<T>;
/**
* Returns a Stream that yields the elements of the Iterable parameter.
* @typeParam T Type of items in the Stream.
* @param iterable Iterable to create the Stream from.
* @returns Stream that yields the elements of the Iterable.
*
* @example
* ```typescript
* const result = from('ABCD');
* console.log([...result]); // ['A', 'B', 'C', 'D']
* ```
*/
declare function from<T>(iterable?: Iterable<T>): Stream<T>;
declare const stream: typeof from;
/**
* Creates a Stream from an iterable (Array, Set, Map, Stream...)
*/
declare function fromAsync<T>(iterable?: AsyncIterable<T>): AsyncStream<T>;
declare const streamAsync: typeof fromAsync;
/**
* Returns a Stream that yields the specified entries.
* @typeParam T Type of items in the Stream.
* @param entries Entries to create the Stream from.
* @returns Stream that yields the specified entries.
*
* @example
* ```typescript
* const result = of(1, 2, 3);
* console.log([...result]); // [1, 2, 3]
* ```
*/
declare function of<T>(...entries: T[]): Stream<T>;
declare const streamOf: typeof of;
/**
* Returns a Stream that merges elements from both iterables by taking one
* element from each, passing them to the function, and yielding the result.
*
* @param a The first iterable to merge.
* @param b The second iterable to merge.
* @param productFunction The function that merges the elements.
* @returns A Stream that merges elements from both iterables.
*
* @example
* ```typescript
* const result = product('ABCD', 'xy', (a, b) => `${a}${b}`);
* console.log([...result]); // ['Ax', 'Ay', 'Bx', 'By', 'Cx', 'Cy', 'Dx', 'Dy']
* ```
*/
declare function product<A, B, O>(a: Iterable<A>, b: Iterable<B>, productFunction: (a: A, b: B) => O): Stream<O>;
/**
* Returns a Stream that yields numbers starting from 'start' up to 'start + count - 1'.
* @param start The first number in the range.
* @param count The number of elements in the range.
* @param by The step between elements.
* @returns A Stream that yields numbers in the range.
*
* @example
* ```typescript
* const result = range(1, 5, 2);
* console.log([...result]); // [1, 3, 5]
* ```
*/
declare function range(start: number, count: number, by?: number): Stream<number>;
declare function isNotNull<T>(value: T | null | undefined): value is NonNullable<T>;
declare function isFunction(x: unknown): x is Function;
declare function isIterable<T>(x: Iterable<T> | AsyncIterable<T>): x is Iterable<T>;
declare function isNotNullOrEmpty<T extends {
length: number;
}>(value: T | null | undefined): value is NonNullable<T>;
declare function isNotNullOrWhitespace(value: string | null | undefined): value is NonNullable<string>;
type EqualsFunction<T> = (a: T, b: T) => boolean;
type CompareFunction<T> = (a: T, b: T) => number;
type MaybeAsyncValue<T> = T | PromiseLike<T>;
type ReduceFunction<T, O = T> = (previous: O, current: T, index: number) => O;
type AsyncReduceFunction<T, O = T> = (previous: O, current: T, index: number) => MaybeAsyncValue<O>;
type ValueOrFactory<T> = T | (() => T);
type PredicateFunction<T> = (item: T, index: number) => boolean;
type MaybeAsyncPredicateFunction<T> = (item: T, index: number) => boolean | Promise<boolean>;
type TypeGuardFunction<T, TOfType extends T> = (item: T, index: number) => item is TOfType;
type CallbackFunction<T> = (item: T, index: number) => void;
type MaybeAsyncCallbackFunction<T> = (item: T, index: number) => void | Promise<void>;
type MapperFunction<T, O> = (item: T, index: number) => O;
type AsyncMapperFunction<T, O> = (item: T, index: number) => PromiseLike<O>;
/**
* Returns a Stream that yields the same value 'times' number of times.
* @param value Value to repeat.
* @param times Number of times to repeat the value.
* @typeParam T Type of the value.
* @returns A Stream that yields the value 'times' number of times.
*
* @example
* ```typescript
* const result = repeat('A', 3);
* console.log([...result]); // ['A', 'A', 'A']
* ```
*/
declare function repeat<T>(value: ValueOrFactory<T>, times?: number): Stream<T>;
/**
* Returns a Stream that merges elements from both iterables by taking one
* element from each, passing them to the function, and yielding the result.
*
* @param a The first iterable to merge.
* @param b The second iterable to merge.
* @param zipFunction The function that merges the elements.
* @returns A Stream that merges elements from both iterables.
*
* @example
* ```typescript
* const result = zip('ABCD', 'xy', (a, b) => `${a}${b}`);
* console.log([...result]); // ['Ax', 'By']
* ```
*/
declare function zip<A, B, O>(a: Iterable<A>, b: Iterable<B>, zipFunction: (a: A, b: B) => O): Stream<O>;
/**
* Returns a Stream that merges elements from both iterables by taking one
* element from each, passing them to the function, and yielding the result.
*/
declare function zipAsync<A, B, O>(a: AsyncIterable<A>, b: AsyncIterable<B>, zipFunction: (a: A, b: B) => O): AsyncStream<O>;
/**
* Returns a Stream that merges elements from both iterables by taking one
* element from each, passing them to the function, and yielding the result.
*
* @param a The first iterable to merge.
* @param b The second iterable to merge.
* @param fillValue The value or factory to use when one iterable is done.
* @param zipFunction The function that merges the elements.
* @returns A Stream that merges elements from both iterables.
*
* @example
* ```typescript
* const result = zipLongest('ABCD', 'xy', ' ', (a, b) => `${a}${b}`);
* console.log([...result]); // ['Ax', 'By', 'C ', 'D ']
* ```
*/
declare function zipLongest<A, B, F, O>(a: Iterable<A>, b: Iterable<B>, fillValue: ValueOrFactory<F>, zipFunction: (a: A | F, b: B | F) => O): Stream<O>;
/**
* Appends the given Iterables to the end of the source Iterable.
* @param iterables Iterables to append.
* @typeParam T Type of items in the Iterables.
* @returns Returns a new Iterable that yields the elements of the source Iterable followed by the elements of the given Iterables.
*
* @example
* ```typescript
* const result = appendWith([4, 5, 6], [7, 8, 9])([1, 2, 3]);
* console.log([...result]); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
* ```
*/
declare function appendWith<T>(...iterables: Iterable<T>[]): OperationFunction<T, T>;
/** Concatenates the Iterable with other Iterables in order */
declare function appendWithAsync<T>(...iterables: Iterable<T>[]): AsyncOperationFunction<T, T>;
/** Returns an Iterable that yields only array entries of the source Iterable that satisfy the function. */
declare function arrayFilter<T>(predicate: (entry: T, index: number) => boolean): OperationFunction<T[], T[]>;
/** Returns an Iterable that yields array entries of the source Iterable transformed using the function */
declare function arrayMap<T, O>(mapper: (entry: T, index: number) => O): OperationFunction<T[], O[]>;
/**
* Buffers the source elements into arrays of 'size' elements.
* @param size The number of elements in each buffer.
* @typeParam T Type of the elements.
* @returns Operation that buffers the source elements.
*
* @example
* ```typescript
* const result = buffer(3)([1, 2, 3, 4, 5, 6]);
* console.log([...result]); // [[1, 2, 3], [4, 5, 6]]
* ```
*/
declare function buffer<T>(size: number): OperationFunction<T, T[]>;
/** Returns an Iterable that yields array of entries of the source Iterable with the given length. */
declare function bufferAsync<T>(size: number): AsyncOperationFunction<T, T[]>;
/** Type-safe helper operation that concatenates multiple operations in order. */
declare function compound<T>(): OperationFunction<T, T>;
declare function compound<T, A>(op1: OperationFunction<T, A>): OperationFunction<T, A>;
declare function compound<T, A, B>(op1: OperationFunction<T, A>, op2: OperationFunction<A, B>): OperationFunction<T, B>;
declare function compound<T, A, B, C>(op1: OperationFunction<T, A>, op2: OperationFunction<A, B>, op3: OperationFunction<B, C>): OperationFunction<T, C>;
declare function compound<T, A, B, C, D>(op1: OperationFunction<T, A>, op2: OperationFunction<A, B>, op3: OperationFunction<B, C>, op4: OperationFunction<C, D>): OperationFunction<T, D>;
declare function compound<T, A, B, C, D, E>(op1: OperationFunction<T, A>, op2: OperationFunction<A, B>, op3: OperationFunction<B, C>, op4: OperationFunction<C, D>, op5: OperationFunction<D, E>): OperationFunction<T, E>;
declare function compound<T, A, B, C, D, E, F>(op1: OperationFunction<T, A>, op2: OperationFunction<A, B>, op3: OperationFunction<B, C>, op4: OperationFunction<C, D>, op5: OperationFunction<D, E>, op6: OperationFunction<E, F>): OperationFunction<T, F>;
declare function compound<T, A, B, C, D, E, F, G>(op1: OperationFunction<T, A>, op2: OperationFunction<A, B>, op3: OperationFunction<B, C>, op4: OperationFunction<C, D>, op5: OperationFunction<D, E>, op6: OperationFunction<E, F>, op7: OperationFunction<F, G>): OperationFunction<T, G>;
declare function compound<T, A, B, C, D, E, F, G, H>(op1: OperationFunction<T, A>, op2: OperationFunction<A, B>, op3: OperationFunction<B, C>, op4: OperationFunction<C, D>, op5: OperationFunction<D, E>, op6: OperationFunction<E, F>, op7: OperationFunction<F, G>, op8: OperationFunction<G, H>): OperationFunction<T, H>;
declare function compound<T, A, B, C, D, E, F, G, H, I>(op1: OperationFunction<T, A>, op2: OperationFunction<A, B>, op3: OperationFunction<B, C>, op4: OperationFunction<C, D>, op5: OperationFunction<D, E>, op6: OperationFunction<E, F>, op7: OperationFunction<F, G>, op8: OperationFunction<G, H>, op9: OperationFunction<H, I>): OperationFunction<T, I>;
declare function compound<T, A, B, C, D, E, F, G, H, I, J>(op1: OperationFunction<T, A>, op2: OperationFunction<A, B>, op3: OperationFunction<B, C>, op4: OperationFunction<C, D>, op5: OperationFunction<D, E>, op6: OperationFunction<E, F>, op7: OperationFunction<F, G>, op8: OperationFunction<G, H>, op9: OperationFunction<H, I>, op10: OperationFunction<I, J>): OperationFunction<T, J>;
declare const pipe: typeof compound;
/** Type-safe helper operation that concatenates multiple operations in order. */
declare function compoundAsync<T>(): AsyncOperationFunction<T, T>;
declare function compoundAsync<T, A>(op1: AsyncOperationFunction<T, A>): AsyncOperationFunction<T, A>;
declare function compoundAsync<T, A, B>(op1: AsyncOperationFunction<T, A>, op2: AsyncOperationFunction<A, B>): AsyncOperationFunction<T, B>;
declare function compoundAsync<T, A, B, C>(op1: AsyncOperationFunction<T, A>, op2: AsyncOperationFunction<A, B>, op3: AsyncOperationFunction<B, C>): AsyncOperationFunction<T, C>;
declare function compoundAsync<T, A, B, C, D>(op1: AsyncOperationFunction<T, A>, op2: AsyncOperationFunction<A, B>, op3: AsyncOperationFunction<B, C>, op4: AsyncOperationFunction<C, D>): AsyncOperationFunction<T, D>;
declare function compoundAsync<T, A, B, C, D, E>(op1: AsyncOperationFunction<T, A>, op2: AsyncOperationFunction<A, B>, op3: AsyncOperationFunction<B, C>, op4: AsyncOperationFunction<C, D>, op5: AsyncOperationFunction<D, E>): AsyncOperationFunction<T, E>;
declare function compoundAsync<T, A, B, C, D, E, F>(op1: AsyncOperationFunction<T, A>, op2: AsyncOperationFunction<A, B>, op3: AsyncOperationFunction<B, C>, op4: AsyncOperationFunction<C, D>, op5: AsyncOperationFunction<D, E>, op6: AsyncOperationFunction<E, F>): AsyncOperationFunction<T, F>;
declare function compoundAsync<T, A, B, C, D, E, F, G>(op1: AsyncOperationFunction<T, A>, op2: AsyncOperationFunction<A, B>, op3: AsyncOperationFunction<B, C>, op4: AsyncOperationFunction<C, D>, op5: AsyncOperationFunction<D, E>, op6: AsyncOperationFunction<E, F>, op7: AsyncOperationFunction<F, G>): AsyncOperationFunction<T, G>;
declare function compoundAsync<T, A, B, C, D, E, F, G, H>(op1: AsyncOperationFunction<T, A>, op2: AsyncOperationFunction<A, B>, op3: AsyncOperationFunction<B, C>, op4: AsyncOperationFunction<C, D>, op5: AsyncOperationFunction<D, E>, op6: AsyncOperationFunction<E, F>, op7: AsyncOperationFunction<F, G>, op8: AsyncOperationFunction<G, H>): AsyncOperationFunction<T, H>;
declare function compoundAsync<T, A, B, C, D, E, F, G, H, I>(op1: AsyncOperationFunction<T, A>, op2: AsyncOperationFunction<A, B>, op3: AsyncOperationFunction<B, C>, op4: AsyncOperationFunction<C, D>, op5: AsyncOperationFunction<D, E>, op6: AsyncOperationFunction<E, F>, op7: AsyncOperationFunction<F, G>, op8: AsyncOperationFunction<G, H>, op9: AsyncOperationFunction<H, I>): AsyncOperationFunction<T, I>;
declare function compoundAsync<T, A, B, C, D, E, F, G, H, I, J>(op1: AsyncOperationFunction<T, A>, op2: AsyncOperationFunction<A, B>, op3: AsyncOperationFunction<B, C>, op4: AsyncOperationFunction<C, D>, op5: AsyncOperationFunction<D, E>, op6: AsyncOperationFunction<E, F>, op7: AsyncOperationFunction<F, G>, op8: AsyncOperationFunction<G, H>, op9: AsyncOperationFunction<H, I>, op10: AsyncOperationFunction<I, J>): AsyncOperationFunction<T, unknown>;
declare const pipeAsync: typeof compoundAsync;
/**
* Concatenates the given Iterables to the end of the source Iterable.
* @param iterables Iterables to concatenate.
* @typeParam T Type of items in the Iterables.
* @returns Returns a new Iterable that yields the elements of the source Iterable followed by the elements of the given Iterables.
*
* @example
* ```typescript
* const result = concatWith([4, 5, 6], [7, 8, 9])([1, 2, 3]);
* console.log([...result]); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
* ```
*/
declare function concatWith<T>(...iterables: Iterable<T>[]): OperationFunction<T, T>;
/** Concatenates the Iterable with other Iterables in order */
declare function concatWithAsync<T>(...iterables: Array<AsyncIterable<T> | Iterable<T>>): AsyncOperationFunction<T, T>;
/**
* Emits a default value if the source is empty.
* @param defaultValue Value to emit if the source is empty.
* @typeParam T Type of items emitted by the source.
* @returns Operation that emits a default value if the source is empty.
*
* @example
* ```typescript
* const result = defaultIfEmpty('A')([]);
* console.log([...result]); // ['A']
* ```
*/
declare function defaultIfEmpty<T>(defaultValue: ValueOrFactory<T>): OperationFunction<T, T>;
/** Returns an Iterable with the value parameter if the source Iterable is empty. */
declare function defaultIfEmptyAsync<T>(defaultValue: ValueOrFactory<T>): AsyncOperationFunction<T, T>;
/**
* Returns a Stream that yields distinct elements from the source.
* @typeParam T Type of items in the source.
* @returns Operation that yields distinct elements from the source.
*
* @example
* ```typescript
* const result = distinct()([1, 2, 1, 3, 2, 4]);
* console.log([...result]); // [1, 2, 3, 4]
* ```
*/
declare function distinct<T>(): OperationFunction<T, T>;
/** Returns an Iterable that yields only entries of the source Iterable without duplicates. */
declare function distinctAsync<T>(): AsyncOperationFunction<T, T>;
/**
* Returns a Stream that yields distinct elements from the source based on the equals function.
* @param equalsFunction Function to compare elements.
* @typeParam T Type of items in the source.
* @returns Operation that yields distinct elements from the source.
*
* @example
* ```typescript
* const result = distinctBy<number>((a, b) => a % 2 === b % 2)([1, 2, 1, 3, 2, 4]);
* console.log([...result]); // [1, 2]
* ```
*/
declare function distinctBy<T>(equalsFunction?: EqualsFunction<T>): OperationFunction<T, T>;
/** Returns an Iterable that yields only entries of the source Iterable without duplicates. */
declare function distinctByAsync<T>(equalsFunction?: EqualsFunction<T>): AsyncOperationFunction<T, T>;
/**
* Returns a Stream that yields elements from the source that are distinct from the previous element.
* @param equalsFunction Function to compare elements.
* @typeParam T Type of items in the source.
* @returns Operation that yields elements from the source that are distinct from the previous element.
*
* @example
* ```typescript
* const result = distinctUntilChanged<number>()([1, 1, 2, 2, 3, 3]);
* console.log([...result]); // [1, 2, 3]
* ```
*/
declare function distinctUntilChanged<T>(equalsFunction?: EqualsFunction<T>): OperationFunction<T, T>;
/** Returns an Iterable that yields only entries of the source Iterable without duplicates. */
declare function distinctUntilChangedAsync<T>(equalsFunction?: EqualsFunction<T>): AsyncOperationFunction<T, T>;
/**
* Returns a Stream that yields elements from the source that are distinct from the previous element based on the key.
* @param key Key to compare elements.
* @param equalsFunction Function to compare elements.
* @typeParam T Type of items in the source.
*
* @example
* ```typescript
* const result = distinctUntilKeyChanged('a')([{ a: 1 }, { a: 1 }, { a: 2 }, { a: 2 }, { a: 3 }, { a: 3 }]);
* console.log([...result]); // [{ a: 1 }, { a: 2 }, { a: 3 }]
* ```
*/
declare function distinctUntilKeyChanged<T, K extends keyof T>(key: K, equalsFunction?: EqualsFunction<T[K]>): OperationFunction<T, T>;
declare function distinctUntilKeyChangedAsync<T, K extends keyof T>(key: K, equalsFunction?: EqualsFunction<T[K]>): AsyncOperationFunction<T, T>;
/**
* Concatenates the given values to the end of the source Iterable.
* @param values Values to concatenate.
* @typeParam T Type of items in the Iterables.
* @returns Returns a new Iterable that yields the elements of the source Iterable followed by the given values.
*
* @example
* ```typescript
* const result = endWith(4, 5, 6)([1, 2, 3]);
* console.log([...result]); // [1, 2, 3, 4, 5, 6]
* ```
*/
declare function endWith<T>(...values: T[]): OperationFunction<T, T>;
/** Returns an Iterable with the entries of the source Iterable then the parameter value. */
declare function endWithAsync<T>(...values: T[]): AsyncOperationFunction<T, T>;
/**
* Returns a Stream that yields elements that are falsy.
* @typeParam T Type of items in the source.
* @returns Operation that yields elements that are falsy.
*
* @example
* ```typescript
* const result = falsy<number>()([0, 1, 2, 3, 4]);
* console.log([...result]); // [0]
* ```
*/
declare function falsy<T>(): OperationFunction<T, T>;
/** Returns an Iterable that yields only entries of the source Iterable with falsy value. */
declare function falsyAsync<T>(): AsyncOperationFunction<T, T>;
/**
* Returns a Stream that yields elements from the source that satisfy the predicate.
* @param predicate Predicate to filter elements.
* @typeParam T Type of items in the source.
* @returns Operation that yields elements from the source that satisfy the predicate.
*
* @example
* ```typescript
* const result = filter((x) => x % 2 === 0)([1, 2, 3, 4, 5]);
* console.log([...result]); // [2, 4]
* ```
*/
declare function filter<T, TOfType extends T = T>(predicate: PredicateFunction<T> | TypeGuardFunction<T, TOfType>): OperationFunction<T, T>;
/** Returns an Iterable that yields only entries of the source Iterable that satisfy the function. */
declare function filterAsync<T>(predicate: PredicateFunction<T>): AsyncOperationFunction<T, T>;
/**
* Returns a Stream that yields elements from the source that are Iterable and flattens them.
* @typeParam T Type of items in the source.
* @returns Operation that yields elements from the source that are Iterable and flattens them.
*
* @example
* ```typescript
* const result = flat<number>()([[1, 2], [3, 4]]);
* console.log([...result]); // [1, 2, 3, 4]
* ```
*/
declare function flat<T>(): OperationFunction<Iterable<T>, T>;
declare const flatten: typeof flat;
/** Returns an Iterable that yields the inner entries of array entries of the source Iterable. */
declare function flatAsync<T>(): AsyncOperationFunction<Iterable<T>, T>;
declare const flattenAsync: typeof flatAsync;
/**
* Maps each element to an Iterable and flattens the result.
* @param mapper Mapping function.
* @typeParam T Type of items in the source.
* @typeParam O Type of items in the resulting Iterable.
* @returns Operation that maps each element to an Iterable and flattens the result.
*
* @example
* ```typescript
* const result = flatMap<number, number>((value) => [value, value + 1])([1, 2, 3]);
* console.log([...result]); // [1, 2, 2, 3, 3, 4]
* ```
*/
declare function flatMap<T, O>(mapper: (value: T, index: number) => Iterable<O>): OperationFunction<T, O>;
/**
* Returns an Iterable that yields the inner entries of the
* result produced by the function.
*/
declare function flatMapAsync<T, O>(mapper: (value: T, index: number) => Iterable<O>): AsyncOperationFunction<T, O>;
/**
* Returns a Stream that yields elements from the source transformed by the mapper.
* @param mapper Function to transform elements.
* @typeParam T Type of items in the source.
* @typeParam O Type of items in the result.
* @returns Operation that yields elements from the source transformed by the mapper.
*
* @example
* ```typescript
* const result = map((x) => x * 2)([1, 2, 3]);
* console.log([...result]); // [2, 4, 6]
* ```
*/
declare function map<T, O>(mapper: (value: T, index: number) => O): OperationFunction<T, O>;
/** Returns an Iterable that yields entries of the source Iterable transformed using the function */
declare function mapAsync<T, O>(mapper: MapperFunction<T, O> | AsyncMapperFunction<T, O>): AsyncOperationFunction<T, O>;
/**
* Returns a Stream that yields the same elements as the source.
* @typeParam T Type of items in the source.
* @returns Operation that yields the same elements as the source.
*
* @example
* ```typescript
* const result = noop<number>()([1, 2, 3]);
* console.log([...result]); // [1, 2, 3]
* ```
*/
declare function noop<T>(): OperationFunction<T, T>;
/** Simply returns every entry from the source Iterable */
declare function noopAsync<T>(): AsyncOperationFunction<T, T>;
/**
* Returns a Stream that yields elements that are not `null`, `undefined`, or empty.
* @typeParam T Type of items in the source.
* @returns Operation that yields elements that are not `null`, `undefined`, or empty.
*
* @example
* ```typescript
* const result = notNullOrEmpty<string>()(["", "a", null, "b", undefined, "c"]);
* console.log([...result]); // ["a", "b", "c"]
* ```
*/
declare function notNullOrEmpty<T extends {
length: number;
}>(): OperationFunction<T | null | undefined, NonNullable<T>>;
/** Returns an Iterable that yields only the non-null / non-undefined / non-empty entries of the source Iterable. */
declare function notNullOrEmptyAsync<T extends {
length: number;
}>(): AsyncOperationFunction<T | undefined | null, NonNullable<T>>;
/**
* Returns a Stream that yields elements that are not `null`, `undefined`, or whitespace.
* @returns Operation that yields elements that are not `null`, `undefined`, or whitespace.
*
* @example
* ```typescript
* const result = notNullOrWhitespace<string>()(["", "a", null, "b", undefined, "c", " "]);
* console.log([...result]); // ["a", "b", "c"]
* ```
*/
declare function notNullOrWhitespace(): OperationFunction<string | null | undefined, NonNullable<string>>;
/** Returns an Iterable that yields only the non-null / non-undefined / non-empty entries of the source Iterable. */
declare function notNullOrWhitespaceAsync(): AsyncOperationFunction<string | null | undefined, NonNullable<string>>;
/**
* Returns a Stream that yields elements that are of the specified type.
* @typeParam T Type of items in the source.
* @typeParam TOfType Type of items to yield.
* @param predicate A function that determines if an item is of the specified type.
* @returns Operation that yields elements that are of the specified type.
*
* @example
* ```typescript
* const result = ofType<string, string>()(Number)(["a", 1, "b", 2]);
* console.log([...result]); // [1, 2]
* ```
*/
declare function ofType<T, TOfType extends T = T>(predicate: TypeGuardFunction<T, TOfType>): OperationFunction<T, TOfType>;
/** Returns and casts an Iterable that yields only entries of the source Iterable that satisfy the given type-guard function. */
declare function ofTypeAsync<T, TOfType extends T = T>(predicate: TypeGuardFunction<T, TOfType>): AsyncOperationFunction<T, TOfType>;
/**
* Returns a Stream that yields pairs of consecutive elements from the source.
* @typeParam T Type of items in the source.
* @returns Operation that yields pairs of consecutive elements from the source.
*
* @example
* ```typescript
* const result = pairwise<number>()([1, 2, 3, 4]);
* console.log([...result]); // [[1, 2], [2, 3], [3, 4]]
* ```
*/
declare function pairwise<T>(): OperationFunction<T, [T, T]>;
/** Returns an Iterable that yields the current and the previous entry of the source Iterable. */
declare function pairwiseAsync<T>(): AsyncOperationFunction<T, [T, T]>;
/**
* Skips the first `count` elements from the source.
* @param count Number of elements to skip.
* @typeParam T Type of items in the source.
* @returns Operation that skips the first `count` elements from the source.
*
* @example
* ```typescript
* const result = skip<number>(2)([1, 2, 3, 4]);
* console.log([...result]); // [3, 4]
* ```
*/
declare function skip<T>(count: number): OperationFunction<T, T>;
/** Returns an Iterable skipping the given amount of entries of the source Iterable. */
declare function skipAsync<T>(count: number): AsyncOperationFunction<T, T>;
/**
* Skips elements from the source while the predicate returns `true`.
* @param predicate Predicate function to determine if an element should be skipped.
* @typeParam T Type of items in the source.
* @returns Operation that skips elements from the source while the predicate returns `true`.
*
* @example
* ```typescript
* const result = skipWhile<number>((x) => x < 3)([1, 2, 3, 4]);
* console.log([...result]); // [3, 4]
* ```
*/
declare function skipWhile<T>(predicate: PredicateFunction<T>): OperationFunction<T, T>;
/** Returns an Iterable skipping entries of the source Iterable while the parameter function returns true. */
declare function skipWhileAsync<T>(predicate: PredicateFunction<T>): AsyncOperationFunction<T, T>;
/**
* Returns a Stream that yields elements from the source followed by the provided values.
* @typeParam T Type of items in the source.
* @param values Values to yield after the source.
* @returns Operation that yields elements from the source followed by the provided values.
*
* @example
* ```typescript
* const result = startWith(0, 1, 2)([3, 4, 5]);
* console.log([...result]); // [0, 1, 2, 3, 4, 5]
* ```
*/
declare function startWith<T>(...values: T[]): OperationFunction<T, T>;
/** Returns an Iterable started with the value parameter then the entries of the source Iterable. */
declare function startWithAsync<T>(...values: T[]): AsyncOperationFunction<T, T>;
/**
* Takes the first `count` elements from the source.
* @param count Number of elements to take.
* @typeParam T Type of items in the source.
* @returns Operation that takes the first `count` elements from the source.
*
* @example
* ```typescript
* const result = take<number>(2)([1, 2, 3, 4]);
* console.log([...result]); // [1, 2]
* ```
*/
declare function take<T>(count: number): OperationFunction<T, T>;
/** Returns an Iterable taking the given amount of entries of the source Iterable. */
declare function takeAsync<T>(count: number): AsyncOperationFunction<T, T>;
/**
* Takes elements from the source while the predicate returns `true`.
* @param predicate Predicate function to determine if an element should be taken.
* @typeParam T Type of items in the source.
* @returns Operation that takes elements from the source while the predicate returns `true`.
*
* @example
* ```typescript
* const result = takeWhile<number>((x) => x < 3)([1, 2, 3, 4]);
* console.log([...result]); // [1, 2]
* ```
*/
declare function takeWhile<T>(predicate: PredicateFunction<T>): OperationFunction<T, T>;
/** Returns an Iterable taking entries of the source Iterable while the parameter function returns true. */
declare function takeWhileAsync<T>(predicate: PredicateFunction<T>): AsyncOperationFunction<T, T>;
/**
* Invokes a callback for each element in the source.
* @param callback Callback function to invoke for each element.
* @typeParam T Type of items in the source.
* @returns Operation that invokes a callback for each element in the source.
*
* @example
* ```typescript
* const result = tap<number>((x) => console.log(x))([1, 2, 3]);
* // Logs:
* // 1
* // 2
* // 3
* console.log([...result]); // [1, 2, 3]
* ```
*/
declare function tap<T>(callback: CallbackFunction<T>): OperationFunction<T, T>;
/** Calls a callback function on each entry */
declare function tapAsync<T>(callback: CallbackFunction<T>): AsyncOperationFunction<T, T>;
/**
* Returns a Stream that yields truthy elements from the source.
* @typeParam T Type of items in the source.
* @returns Operation that yields truthy elements from the source.
*
* @example
* ```typescript
* const result = truthy<number>()([0, 1, 2, 3]);
* console.log([...result]); // [1, 2, 3]
* ```
*/
declare function truthy<T>(): OperationFunction<T, T>;
/** Returns an Iterable that yields only entries of the source Iterable with truthy value. */
declare function truthyAsync<T>(): AsyncOperationFunction<T, T>;
/**
* Checks if all elements in the source satisfy the predicate.
* @param predicate Predicate function to determine if an element satisfies a condition.
* @typeParam T Type of items in the source.
* @returns Collector that checks if all elements in the source satisfy the predicate.
*
* @example
* ```typescript
* const result = all<number>((x) => x > 0)([1, 2, 3]);
* console.log(result); // true
* ```
*/
declare function all<T>(predicate: PredicateFunction<T>): CollectorFunction<T, boolean>;
declare const every: typeof all;
/** Returns true if all entries satisfy the 'predicate' function. */
declare function allAsync<T>(predicate: MaybeAsyncPredicateFunction<T>): AsyncCollectorFunction<T, boolean>;
declare const everyAsync: typeof allAsync;
/**
* Checks if any element in the source satisfies the predicate.
* @param predicate Predicate function to determine if an element satisfies a condition.
* @typeParam T Type of items in the source.
* @returns Collector that checks if any element in the source satisfies the predicate.
*
* @example
* ```typescript
* const result = any<number>((x) => x > 2)([1, 2, 3]);
* console.log(result); // true
* ```
*/
declare function any<T>(predicate?: PredicateFunction<T>): CollectorFunction<T, boolean>;
declare const some: typeof any;
/** Returns true if at least one of the entries satisfies the 'predicate' function. */
declare function anyAsync<T>(predicate?: MaybeAsyncPredicateFunction<T>): AsyncCollectorFunction<T, boolean>;
declare const someAsync: typeof anyAsync;
/**
* Checks if the source contains a specific value.
* @param value Value to check for.
* @param equalsFunction Optional function to compare values.
* @typeParam T Type of items in the source.
* @returns Collector that checks if the source contains a specific value.
*
* @example
* ```typescript
* const result = contains(2)([1, 2, 3]);
* console.log(result); // true
* ```
*/
declare function contains<T>(value: T, equalsFunction?: EqualsFunction<T>): CollectorFunction<T, boolean>;
declare const includes: typeof contains;
/** Returns if at least one of the entries equals with the given 'value'. */
declare function containsAsync<T>(value: T, equalsFunction?: EqualsFunction<T>): AsyncCollectorFunction<T, boolean>;
declare const includesAsync: typeof containsAsync;
/**
* Counts the number of elements in the source.
* @param predicateFunction Predicate function to determine if an element should be counted.
* @typeParam T Type of items in the source.
* @returns Collector that counts the number of elements in the source.
*
* @example
* ```typescript
* const result = count<number>()([1, 2, 3]);
* console.log(result); // 3
* ```
*/
declare function count<T>(predicateFunction?: PredicateFunction<T>): CollectorFunction<T, number>;
declare const length: typeof count;
/** Returns the number of entries in the Iterable. */
declare function countAsync<T>(predicateFunction?: PredicateFunction<T>): AsyncCollectorFunction<T, number>;
declare const lengthAsync: typeof countAsync;
/**
* Gets the element at the specified index.
* @param index Index of the element to get.
* @typeParam T Type of items in the source.
* @returns Collector that gets the element at the specified index.
*
* @example
* ```typescript
* const result = elementAt<number>(1)([1, 2, 3]);
* console.log(result); // 2
* ```
*/
declare function elementAt<T>(index: number): CollectorFunction<T, T | undefined>;
/** Returns the nth entry from the Iterable. */
declare function elementAtAsync<T>(index: number): AsyncCollectorFunction<T, T | undefined>;
/**
* Returns the first element in the source that satisfies the predicate.
* @param predicate Predicate function to determine if an element should be returned.
* @typeParam T Type of items in the source.
* @returns Collector that returns the first element in the source that satisfies the predicate.
*
* @example
* ```typescript
* const result = first<number>((x) => x > 1)([1, 2, 3]);
* console.log(result); // 2
* ```
*/
declare function first<T>(predicate?: PredicateFunction<T>): CollectorFunction<T, T | undefined>;
declare const find: typeof first;
/** Returns the first entry from the Iterable that satisfy then 'predicate' function. */
declare function firstAsync<T>(predicate?: MaybeAsyncPredicateFunction<T>): AsyncCollectorFunction<T, T | undefined>;
declare const findAsync: typeof firstAsync;
/**
* Returns the index of the first element in the source that satisfies the predicate.
* @param predicate Predicate function to determine if an element should be returned.
* @typeParam T Type of items in the source.
* @returns Collector that returns the index of the first element in the source that satisfies the predicate.
*
* @example
* ```typescript
* const result = firstIndex<number>((x) => x > 1)([1, 2, 3]);
* console.log(result); // 1
* ```
*/
declare function firstIndex<T>(predicate?: PredicateFunction<T>): CollectorFunction<T, number>;
declare const findIndex: typeof firstIndex;
/** Returns the index of the first entry from the Iterable that satisfy then 'predicate' function. */
declare function firstIndexAsync<T>(predicate?: MaybeAsyncPredicateFunction<T>): AsyncCollectorFunction<T, number>;
declare const findIndexAsync: typeof firstIndexAsync;
/**
* Returns the first element in the source that satisfies the predicate or a default value.
* @param defaultValue Default value or factory to use if no element satisfies the predicate.
* @param predicate Predicate function to determine if an element should be returned.
* @typeParam T Type of items in the source.
* @returns Collector that returns the first element in the source that satisfies the predicate or a default value.
*
* @example
* ```typescript
* const result = firstOrDefault<number>(0, (x) => x > 1)([1, 2, 3]);
* console.log(result); // 2
* ```
*/
declare function firstOrDefault<T>(defaultValue: ValueOrFactory<T>, predicate?: PredicateFunction<T>): CollectorFunction<T, T>;
declare const findOrDefault: typeof firstOrDefault;
/** Returns the first entry from the Iterable that satisfy then 'predicate' function or the 'defaultValue'. */
declare function firstOrDefaultAsync<T>(defaultValue: ValueOrFactory<T>, predicate?: MaybeAsyncPredicateFunction<T>): AsyncCollectorFunction<T, T>;
declare const findOrDefaultAsync: typeof firstOrDefaultAsync;
/**
* Executes a callback for each element in the source.
* @param callback Callback function to execute for each element.
* @typeParam T Type of items in the source.
* @returns Collector that executes a callback for each element in the source.
*
* @example
* ```typescript
* forEach<number>((x) => console.log(x))([1, 2, 3]);
* // 1
* // 2
* // 3
* ```
*/
declare function forEach<T>(callback: CallbackFunction<T>): CollectorFunction<T, void>;
/** Call a callback function on every entry. */
declare function forEachAsync<T>(callback: MaybeAsyncCallbackFunction<T>): AsyncCollectorFunction<T, void>;
/**
* Groups the source by a key selector.
* @param keySelector Key selector function.
* @typeParam T Type of items in the source.
* @typeParam TKey Type of the key.
* @returns Collector that groups the source by a key selector.
*
* @example
* ```typescript
* const result = groupBy<number, string>((x) => x % 2 === 0 ? "even" : "odd")([1, 2, 3, 4]);
* console.log(result);
* // Map {
* // 'odd' => [1, 3],
* // 'even' => [2, 4],
* // }
* ```
*/
declare function groupBy<T, TKey>(keySelector: (entry: T) => TKey): CollectorFunction<T, Map<TKey, T[]>>;
/** Creates a group of entries where the group key is calculated by the selector function. */
declare function groupByAsync<T, TKey>(keySelector: (entry: T) => TKey): AsyncCollectorFunction<T, Map<TKey, T[]>>;
/**
* Groups the source by a key selector.
* @param keySelector Key selector function.
* @typeParam T Type of items in the source.
* @typeParam TKey Type of the key.
* @returns Collector that groups the source by a key selector.
*
* @example
* ```typescript
* const result = groupByRecord<number, string>((x) => x % 2 === 0 ? "even" : "odd")([1, 2, 3, 4]);
* console.log(result);
* // {
* // 'odd': [1, 3],
* // 'even': [2, 4],
* // }
* ```
*/
declare function groupByRecord<T, TKey extends string | number | symbol>(keySelector: (entry: T) => TKey): CollectorFunction<T, Record<TKey, T[]>>;
declare const group: typeof groupByRecord;
/** Creates a group of entries where the group key is calculated by the selector function. */
declare function groupByRecordAsync<T, TKey extends string | number | symbol>(keySelector: (entry: T) => TKey): AsyncCollectorFunction<T, Record<TKey, T[]>>;
declare const groupAsync: typeof groupByRecordAsync;
/**
* Determines if the source is empty.
* @typeParam T Type of items in the source.
* @returns Collector that determines if the source is empty.
*
* @example
* ```typescript
* const result = isEmpty<number>()([1, 2, 3]);
* console.log(result); // false
* ```
*/
declare function isEmpty<T>(): CollectorFunction<T, boolean>;
/** Returns true if the AsyncIterable has 0 entry. */
declare function isEmptyAsync<T>(): AsyncCollectorFunction<T, boolean>;
/**
* Joins the source into a string.
* @param separator Separator between elements.
* @typeParam T Type of items in the source.
* @returns Collector that joins the source into a string.
*
* @example
* ```typescript
* const result = join<number>()([1, 2, 3]);
* console.log(result); // "1,2,3"
* ```
*/
declare function join<T>(separator?: string): CollectorFunction<T, string>;
/** Returns a string of all entries in the Iterable joined together seperated a given string. */
declare function joinAsync<T>(separator?: string): AsyncCollectorFunction<T, string>;
/**
* Returns the last element in the source that satisfies the predicate.
* @param predicate Predicate function to determine if an element should be returned.
* @typeParam T Type of items in the source.
* @returns Collector that returns the last element in the source that satisfies the predicate.
*
* @example
* ```typescript
* const result = last<number>((x) => x > 1)([1, 2, 3]);
* console.log(result); // 3
* ```
*/
declare function last<T>(predicate?: PredicateFunction<T>): CollectorFunction<T, T | undefined>;
declare const findLast: typeof last;
/** Returns the last entry from the Iterable that satisfy then 'predicate' function. */
declare function lastAsync<T>(predicate?: MaybeAsyncPredicateFunction<T>): AsyncCollectorFunction<T, T | undefined>;
declare const findLastAsync: typeof lastAsync;
/**
* Returns the index of the last element in the source that satisfies the predicate.
* @param predicate Predicate function to determine if an element should be returned.
* @typeParam T Type of items in the source.
* @returns Collector that returns the index of the last element in the source that satisfies the predicate.
*
* @example
* ```typescript
* const result = lastIndex<number>((x) => x > 1)([1, 2, 3]);
* console.log(result); // 2
* ```
*/
declare function lastIndex<T>(predicate?: PredicateFunction<T>): CollectorFunction<T, number>;
declare const findLastIndex: typeof lastIndex;
/** Returns the index of the last entry from the Iterable that satisfy then 'predicate' function. */
declare function lastIndexAsync<T>(predicate?: MaybeAsyncPredicateFunction<T>): AsyncCollectorFunction<T, number>;
declare const findLastIndexAsync: typeof lastIndexAsync;
/**
* Returns the last element in the source that satisfies the predicate or a default value if no such element is found.
* @param defaultValue Default value to return if no element is found.
* @param predicate Predicate function to determine if an element should be returned.
* @typeParam T Type of items in the source.
* @returns Collector that returns the last element in the source that satisfies the predicate or a default value if no such element is found.
*
* @example
* ```typescript
* const result = lastOrDefault<number>(0, (x) => x > 1)([1, 2, 3]);
* console.log(result); // 3
* ```
*/
declare function lastOrDefault<T>(defaultValue: ValueOrFactory<T>, predicate?: PredicateFunction<T>): CollectorFunction<T, T | undefined>;
declare const findLastOrDefault: typeof lastOrDefault;
/** Returns the last entry from the Iterable that satisfy then 'predicate' function. */
declare function lastOrDefaultAsync<T>(defaultValue: ValueOrFactory<T>, predicate?: MaybeAsyncPredicateFunction<T>): AsyncCollectorFunction<T, T | undefined>;
declare const findLastOrDefaultAsync: typeof lastOrDefaultAsync;
/**
* Returns the maximum value in a sequence of numbers.
* @param numbers Sequence of numbers to find the maximum value.
* @returns Maximum value in the sequence.
*
* @example
* ```typescript
* const result = max([1, 2, 3]);
* console.log(result); // 3
* ```
*/
declare const max: CollectorFunction<number, number | undefined>;
/** Return the largest value of all entries in the Iterable */
declare const maxAsync: AsyncCollectorFunction<number, number | undefined>;
/**
* Returns the element in the source that has the maximum value according to the comparer.
* @param comparer Comparer function to determine the maximum value.
* @typeParam T Type of items in the source.
* @returns Collector that returns the element in the source that has the maximum value according to the comparer.
*
* @example
* ```typescript
* const result = maxBy<number>((a, b) => a - b)([1, 2, 3]);
* console.log(result); // 3
* ```
*/
declare function maxBy<T>(comparer: CompareFuncti