import { Expression } from "jokenizer"; export type Ctor = new (...args: never[]) => T; export type Func1 = ((p1: T1) => T2) | string; export type Func2 = ((p1: T1, p2: T2) => T3) | string; export type Predicate = Func1; export type TypePredicate = (t: unknown) => t is T; export interface Value { value: T; } export type Result = {} extends TExtra ? T : Value & TExtra; export interface IGrouping extends Array { key: TKey; } export interface IQueryProvider { createQuery(parts?: IQueryPart[]): IQueryBase; execute(parts: IQueryPart[]): TResult; executeAsync(parts: IQueryPart[]): PromiseLike; } export interface IPartArgument { readonly func: Function; readonly exp: Expression; readonly literal: unknown; readonly scopes: unknown[]; } export interface IQueryPart { readonly type: string; readonly args: IPartArgument[]; readonly scopes: unknown[]; } export interface IQueryBase { readonly provider: IQueryProvider; readonly parts: IQueryPart[]; } export interface InlineCountInfo { readonly inlineCount: number; } interface IQueryDuplicates { concat(other: T[]): IQuery; join(other: TOther[], thisKey: Func1, otherKey: Func1, selector: Func2, ...scopes: unknown[]): IQuery; join(other: TOther[], thisKey: Func1, otherKey: Func1, selector: Func2, ctor: Ctor, ...scopes: unknown[]): IQuery; reverse(): IQuery; } export interface IQuerySafe extends IQueryBase, Iterable { aggregate(func: Func2, seed?: TAccumulate, ...scopes: unknown[]): TAccumulate; aggregateAsync(func: Func2, seed?: TAccumulate, ...scopes: unknown[]): PromiseLike; all(predicate: Predicate, ...scopes: unknown[]): Result; allAsync(predicate: Predicate, ...scopes: unknown[]): PromiseLike>; any(predicate?: Predicate, ...scopes: unknown[]): Result; anyAsync(predicate?: Predicate, ...scopes: unknown[]): PromiseLike>; average(selector?: Func1, ...scopes: unknown[]): Result; averageAsync(selector?: Func1, ...scopes: unknown[]): PromiseLike>; cast(type: Ctor): IQuery; contains(item: T, comparer?: Func2, ...scopes: unknown[]): Result; containsAsync(item: T, comparer?: Func2, ...scopes: unknown[]): PromiseLike>; count(predicate?: Predicate, ...scopes: unknown[]): Result; countAsync(predicate?: Predicate, ...scopes: unknown[]): PromiseLike>; defaultIfEmpty(defaultValue?: T | null): IQuery; distinct(comparer?: Func2, ...scopes: unknown[]): IQuery; elementAt(index: number): Result; elementAtAsync(index: number): PromiseLike>; elementAtOrDefault(index: number): Result; elementAtOrDefaultAsync(index: number): PromiseLike>; except(other: T[], comparer?: Func2, ...scopes: unknown[]): IQuery; first(predicate?: Predicate, ...scopes: unknown[]): Result; firstAsync(predicate?: Predicate, ...scopes: unknown[]): PromiseLike>; firstOrDefault(predicate?: Predicate, ...scopes: unknown[]): Result; firstOrDefaultAsync(predicate?: Predicate, ...scopes: unknown[]): PromiseLike>; groupBy>(keySelector: Func1, elementSelector?: Func2, ...scopes: unknown[]): IQuery; groupBy>(keySelector: Func1, elementSelector?: Func2, ctor?: Ctor, ...scopes: unknown[]): IQuery; groupJoin(other: TOther[], thisKey: Func1, otherKey: Func1, selector: Func2, ...scopes: unknown[]): IQuery; groupJoin(other: TOther[], thisKey: Func1, otherKey: Func1, selector: Func2, ctor?: Ctor, ...scopes: unknown[]): IQuery; inlineCount(): IQuery; intersect(other: T[], comparer?: Func2, ...scopes: unknown[]): IQuery; last(predicate?: Predicate, ...scopes: unknown[]): Result; lastAsync(predicate?: Predicate, ...scopes: unknown[]): PromiseLike>; lastOrDefault(predicate?: Predicate, ...scopes: unknown[]): Result; lastOrDefaultAsync(predicate?: Predicate, ...scopes: unknown[]): PromiseLike>; max(selector?: Func1, ...scopes: unknown[]): Result; maxAsync(selector?: Func1, ...scopes: unknown[]): PromiseLike>; min(selector?: Func1, ...scopes: unknown[]): Result; minAsync(selector?: Func1, ...scopes: unknown[]): PromiseLike>; ofGuardedType(checker: TypePredicate): IQuery; ofType(type: Ctor | TResult): IQuery; orderBy(keySelector: Func1, ...scopes: unknown[]): IOrderedQuery; orderByDescending(keySelector: Func1, ...scopes: unknown[]): IOrderedQuery; select(selector: Func1, ...scopes: unknown[]): IQuery; select(selector: Func1, ctor: Ctor, ...scopes: unknown[]): IQuery; selectMany(selector: Func1, ...scopes: unknown[]): IQuery; selectMany(selector: Func1, ctor: Ctor, ...scopes: unknown[]): IQuery; sequenceEqual(other: T[], comparer?: Func2, ...scopes: unknown[]): Result; sequenceEqualAsync(other: T[], comparer?: Func2, ...scopes: unknown[]): PromiseLike>; single(predicate?: Predicate, ...scopes: unknown[]): Result; singleAsync(predicate?: Predicate, ...scopes: unknown[]): PromiseLike>; singleOrDefault(predicate?: Predicate, ...scopes: unknown[]): Result; singleOrDefaultAsync(predicate?: Predicate, ...scopes: unknown[]): PromiseLike>; skip(count: number): IQuery; skipWhile(predicate: Predicate, ...scopes: unknown[]): IQuery; sum(selector?: Func1, ...scopes: unknown[]): Result; sumAsync(selector?: Func1, ...scopes: unknown[]): PromiseLike>; take(count: number): IQuery; takeWhile(predicate: Predicate, ...scopes: unknown[]): IQuery; union(other: T[], comparer?: Func2, ...scopes: unknown[]): IQuery; where(predicate: Predicate, ...scopes: unknown[]): IQuery; zip(other: TOther[], selector: Func2, ...scopes: unknown[]): IQuery; zip(other: TOther[], selector: Func2, ctor: Ctor, ...scopes: unknown[]): IQuery; toArray(ctor?: Ctor): Result; toArrayAsync(ctor?: Ctor): PromiseLike>; } export type IQuery = IQuerySafe & IQueryDuplicates; export interface IOrderedQuery extends IQuery { thenBy(selector: Func1, ...scopes: unknown[]): IOrderedQuery; thenByDescending(keySelector: Func1, ...scopes: unknown[]): IOrderedQuery; } export {};