/**
 * @module Collection
 */
import type { EnsureMap, EnsureRecord } from "../../../collection/contracts/_module-exports.js";
import { type Collapse, type Comparator, type PredicateInvokable, type ICollection, type Map, type Modifier, type Tap, type Transform, type Reduce, type ForEach, type CrossJoinResult } from "../../../collection/contracts/_module-exports.js";
import { type Lazyable } from "../../../utilities/_module-exports.js";
import type { StandardSchemaV1 } from "@standard-schema/spec";
/**
 * All methods in `ListCollection` are executed eagerly.
 *
 * IMPORT_PATH: `"@daiso-tech/core/collection"`
 * @group Adapters
 */
export declare class ListCollection<TInput = unknown> implements ICollection<TInput> {
    /**
     * The `concat` static method is a convenient utility for easily concatenating multiple {@link Iterable | `Iterable`}.
     * @example
     * ```ts
     * import { ListCollection } from "@daiso-tech/core/collection";
     *
     * class MyIterable implements Iterable<number> {
     *   *[Symbol.iterator](): Iterator<number> {
     *     yield 1;
     *     yield 2;
     *     yield 3;
     *   }
     * }
     *
     * const collection = ListCollection.concat([
     *   new MyIterable(),
     *   new Set([1, 2, 3]),
     *   new Map([["a", 1], ["b", 2]]),
     *   ["a", "b", "c"]
     * ]);
     * collection.toArray();
     * // [1, 2, 3, 1, 2, 3, ["a", 1], ["b", 2], "a", "b", "c"]
     * ```
     */
    static concat<TValue>(iterables: Iterable<Iterable<TValue>>): ICollection<TValue>;
    /**
     * The `difference` static method is used to compute the difference between two {@link Iterable | `Iterable`} instances. By default, the equality check is performed on each item.
     * @example
     * ```ts
     * import { ListCollection } from "@daiso-tech/core/collection";
     *
     * const collection = ListCollection.difference(
     *   [1, 2, 2, 3, 4, 5],
     *   [2, 4, 6, 8]
     * );
     * collection.toArray();
     * // [1, 3, 5]
     * ```
     * @example
     * ```ts
     * import { ListCollection } from "@daiso-tech/core/collection";
     *
     * const collection = ListCollection.difference(
     *   [
     *     { name: "iPhone 6", brand: "Apple", type: "phone" },
     *     { name: "iPhone 5", brand: "Apple", type: "phone" },
     *     { name: "Apple Watch", brand: "Apple", type: "watch" },
     *     { name: "Galaxy S6", brand: "Samsung", type: "phone" },
     *     { name: "Galaxy Gear", brand: "Samsung", type: "watch" },
     *   ],
     *   [
     *     { name: "Apple Watch", brand: "Apple", type: "watch" },
     *   ],
     *   (product) => product.type
     * );
     * collection.toArray();
     * // [
     * //   { name: "iPhone 6", brand: "Apple", type: "phone" },
     * //   { name: "iPhone 5", brand: "Apple", type: "phone" },
     * //   { name: "Galaxy S6", brand: "Samsung", type: "phone" },
     * // ]
     * ```
     */
    static difference<TValue, TSelect>(iterableA: Iterable<TValue>, iterableB: Iterable<TValue>, selectFn?: Map<TValue, ICollection<TValue>, TSelect>): ICollection<TValue>;
    /**
     * The `zip` static method merges together the values of `iterableA` with the values of the `iterableB` at their corresponding index.
     * The returned collection has size of the shortest collection.
     * @example
     * ```ts
     * import { ListCollection } from "@daiso-tech/core/collection";
     *
     * const collection = ListCollection.zip(["Chair", "Desk"], [100, 200]);
     * collection.toArray();
     * // [["Chair", 100], ["Desk", 200]]
     * ```
     * @example
     * ```ts
     * import { ListCollection } from "@daiso-tech/core/collection";
     *
     * const collection = ListCollection.zip(["Chair", "Desk", "Couch"], [100, 200]);
     * collection.toArray();
     * // [["Chair", 100], ["Desk", 200]]
     * ```
     * @example
     * ```ts
     * import { ListCollection } from "@daiso-tech/core/collection";
     *
     * const collection = ListCollection.zip(["Chair", "Desk"], [100, 200, 300]);
     * collection.toArray();
     * // [["Chair", 100], ["Desk", 200]]
     * ```
     */
    static zip<TValueA, TValueB>(iterableA: Iterable<TValueA>, iterableB: Iterable<TValueB>): ICollection<[TValueA, TValueB]>;
    static deserialize<TInput>(serializedValue: TInput[]): ICollection<TInput>;
    private array;
    /**
     * The `constructor` takes an {@link Iterable | `Iterable`}.
     *
     * Works with `Array`.
     * @example
     * ```ts
     * import { ListCollection } from "@daiso-tech/core/collection";
     *
     * const collection = new ListCollection([1, 2, 3, 4]);
     * ```
     *
     * Works with `String`.
     * @example
     * ```ts
     * import { ListCollection } from "@daiso-tech/core/collection";
     *
     * const collection = new ListCollection("ABCDE");
     * ```
     *
     * Works with `Set`.
     * @example
     * ```ts
     * import { ListCollection } from "@daiso-tech/core/collection";
     *
     * const collection = new ListCollection(new Set([1, 2, 2 4]));
     * ```
     *
     * Works with `Map`.
     * @example
     * ```ts
     * import { ListCollection } from "@daiso-tech/core/collection";
     *
     * const collection = new ListCollection(new Map([["a", 1], ["b", 2]]));
     * ```
     *
     * Works with any `Iterable`.
     * @example
     * ```ts
     * import { ListCollection } from "@daiso-tech/core/collection";
     *
     * class MyIterable implements Iterable<number> {
     *   *[Symbol.iterator](): Iterator<number> {
     *     yield 1;
     *     yield 2;
     *     yield 3;
     *   }
     * }
     * const collection = new ListCollection(new MyIterable());
     * ```
     */
    constructor(iterable?: Iterable<TInput>);
    serialize(): TInput[];
    [Symbol.iterator](): Iterator<TInput>;
    toIterator(): Iterator<TInput, void>;
    entries(): ICollection<[number, TInput]>;
    keys(): ICollection<number>;
    copy(): ICollection<TInput>;
    filter<TOutput extends TInput>(predicateFn: PredicateInvokable<TInput, ICollection<TInput>, TOutput>): ICollection<TOutput>;
    validate<TOutput>(schema: StandardSchemaV1<TInput, TOutput>): ICollection<TOutput>;
    reject<TOutput extends TInput>(predicateFn: PredicateInvokable<TInput, ICollection<TInput>, TOutput>): ICollection<Exclude<TInput, TOutput>>;
    map<TOutput>(mapFn: Map<TInput, ICollection<TInput>, TOutput>): ICollection<TOutput>;
    reduce(reduceFn: Reduce<TInput, ICollection<TInput>, TInput>): TInput;
    reduce(reduceFn: Reduce<TInput, ICollection<TInput>, TInput>, initialValue: TInput): TInput;
    reduce<TOutput>(reduceFn: Reduce<TInput, ICollection<TInput>, TOutput>, initialValue: TOutput): TOutput;
    join(separator?: string): Extract<TInput, string>;
    collapse(): ICollection<Collapse<TInput>>;
    flatMap<TOutput>(mapFn: Map<TInput, ICollection<TInput>, Iterable<TOutput>>): ICollection<TOutput>;
    change<TFilterOutput extends TInput, TMapOutput>(predicateFn: PredicateInvokable<TInput, ICollection<TInput>, TFilterOutput>, mapFn: Map<TFilterOutput, ICollection<TInput>, TMapOutput>): ICollection<TInput | TFilterOutput | TMapOutput>;
    set(index: number, value: TInput | Map<TInput, ICollection<TInput>, TInput>): ICollection<TInput>;
    get(index: number): TInput | null;
    getOrFail(index: number): TInput;
    page(page: number, pageSize: number): ICollection<TInput>;
    sum(): Extract<TInput, number>;
    average(): Extract<TInput, number>;
    median(): Extract<TInput, number>;
    min(): Extract<TInput, number>;
    max(): Extract<TInput, number>;
    percentage(predicateFn: PredicateInvokable<TInput, ICollection<TInput>>): number;
    some<TOutput extends TInput>(predicateFn: PredicateInvokable<TInput, ICollection<TInput>, TOutput>): boolean;
    every<TOutput extends TInput>(predicateFn: PredicateInvokable<TInput, ICollection<TInput>, TOutput>): boolean;
    take(limit: number): ICollection<TInput>;
    takeUntil(predicateFn: PredicateInvokable<TInput, ICollection<TInput>>): ICollection<TInput>;
    takeWhile(predicateFn: PredicateInvokable<TInput, ICollection<TInput>>): ICollection<TInput>;
    skip(offset: number): ICollection<TInput>;
    skipUntil(predicateFn: PredicateInvokable<TInput, ICollection<TInput>>): ICollection<TInput>;
    skipWhile(predicateFn: PredicateInvokable<TInput, ICollection<TInput>>): ICollection<TInput>;
    when<TExtended = TInput>(condition: boolean, callback: Modifier<ICollection<TInput>, ICollection<TExtended>>): ICollection<TInput | TExtended>;
    whenEmpty<TExtended = TInput>(callback: Modifier<ICollection<TInput>, ICollection<TExtended>>): ICollection<TInput | TExtended>;
    whenNot<TExtended = TInput>(condition: boolean, callback: Modifier<ICollection<TInput>, ICollection<TExtended>>): ICollection<TInput | TExtended>;
    whenNotEmpty<TExtended = TInput>(callback: Modifier<ICollection<TInput>, ICollection<TExtended>>): ICollection<TInput | TExtended>;
    pipe<TOutput = TInput>(callback: Transform<ICollection<TInput>, TOutput>): TOutput;
    tap(callback: Tap<ICollection<TInput>>): ICollection<TInput>;
    chunk(chunkSize: number): ICollection<ICollection<TInput>>;
    chunkWhile(predicateFn: PredicateInvokable<TInput, ICollection<TInput>>): ICollection<ICollection<TInput>>;
    split(chunkAmount: number): ICollection<ICollection<TInput>>;
    partition(predicateFn: PredicateInvokable<TInput, ICollection<TInput>>): ICollection<ICollection<TInput>>;
    sliding(chunkSize: number, step?: number): ICollection<ICollection<TInput>>;
    groupBy<TOutput = TInput>(selectFn?: Map<TInput, ICollection<TInput>, TOutput>): ICollection<[TOutput, ICollection<TInput>]>;
    countBy<TOutput = TInput>(selectFn?: Map<TInput, ICollection<TInput>, TOutput>): ICollection<[TOutput, number]>;
    unique<TOutput = TInput>(selectFn?: Map<TInput, ICollection<TInput>, TOutput>): ICollection<TInput>;
    difference<TOutput = TInput>(iterable: Iterable<TInput>, selectFn?: Map<TInput, ICollection<TInput>, TOutput>): ICollection<TInput>;
    repeat(amount: number): ICollection<TInput>;
    padStart<TExtended = TInput>(maxLength: number, fillItems: Iterable<TExtended>): ICollection<TInput | TExtended>;
    padEnd<TExtended = TInput>(maxLength: number, fillItems: Iterable<TExtended>): ICollection<TInput | TExtended>;
    slice(start?: number, end?: number): ICollection<TInput>;
    prepend<TExtended = TInput>(iterable: Iterable<TInput | TExtended>): ICollection<TInput | TExtended>;
    append<TExtended = TInput>(iterable: Iterable<TInput | TExtended>): ICollection<TInput | TExtended>;
    insertBefore<TExtended = TInput>(predicateFn: PredicateInvokable<TInput, ICollection<TInput>>, iterable: Iterable<TInput | TExtended>): ICollection<TInput | TExtended>;
    insertAfter<TExtended = TInput>(predicateFn: PredicateInvokable<TInput, ICollection<TInput>>, iterable: Iterable<TInput | TExtended>): ICollection<TInput | TExtended>;
    crossJoin<TExtended>(iterable: Iterable<TExtended>): ICollection<CrossJoinResult<TInput, TExtended>>;
    zip<TExtended>(iterable: Iterable<TExtended>): ICollection<[TInput, TExtended]>;
    sort(comparator?: Comparator<TInput>): ICollection<TInput>;
    reverse(_chunkSize?: number): ICollection<TInput>;
    shuffle(mathRandom?: () => number): ICollection<TInput>;
    first<TOutput extends TInput>(predicateFn?: PredicateInvokable<TInput, ICollection<TInput>, TOutput>): TOutput | null;
    firstOr<TOutput extends TInput, TExtended = TInput>(defaultValue: Lazyable<TExtended>, predicateFn?: PredicateInvokable<TInput, ICollection<TInput>, TOutput>): TOutput | TExtended;
    firstOrFail<TOutput extends TInput>(predicateFn?: PredicateInvokable<TInput, ICollection<TInput>, TOutput>): TOutput;
    last<TOutput extends TInput>(predicateFn?: PredicateInvokable<TInput, ICollection<TInput>, TOutput>): TOutput | null;
    lastOr<TOutput extends TInput, TExtended = TInput>(defaultValue: Lazyable<TExtended>, predicateFn?: PredicateInvokable<TInput, ICollection<TInput>, TOutput>): TOutput | TExtended;
    lastOrFail<TOutput extends TInput>(predicateFn?: PredicateInvokable<TInput, ICollection<TInput>, TOutput>): TOutput;
    before(predicateFn: PredicateInvokable<TInput, ICollection<TInput>>): TInput | null;
    beforeOr<TExtended = TInput>(defaultValue: Lazyable<TExtended>, predicateFn: PredicateInvokable<TInput, ICollection<TInput>>): TInput | TExtended;
    beforeOrFail(predicateFn: PredicateInvokable<TInput, ICollection<TInput>>): TInput;
    after(predicateFn: PredicateInvokable<TInput, ICollection<TInput>>): TInput | null;
    afterOr<TExtended = TInput>(defaultValue: Lazyable<TExtended>, predicateFn: PredicateInvokable<TInput, ICollection<TInput>>): TInput | TExtended;
    afterOrFail(predicateFn: PredicateInvokable<TInput, ICollection<TInput>>): TInput;
    sole<TOutput extends TInput>(predicateFn: PredicateInvokable<TInput, ICollection<TInput>, TOutput>): TOutput;
    nth(step: number): ICollection<TInput>;
    count(predicateFn: PredicateInvokable<TInput, ICollection<TInput>>): number;
    size(): number;
    isEmpty(): boolean;
    isNotEmpty(): boolean;
    searchFirst(predicateFn: PredicateInvokable<TInput, ICollection<TInput>>): number;
    searchLast(predicateFn: PredicateInvokable<TInput, ICollection<TInput>>): number;
    forEach(callback: ForEach<TInput, ICollection<TInput>>): void;
    toArray(): TInput[];
    toRecord(): EnsureRecord<TInput>;
    toMap(): EnsureMap<TInput>;
}
