import { Key, Comparator } from "./utils"; export interface Operation { readonly success: boolean; readonly done: boolean; reset(): any; next(item: any, key: Key, owner: any): any; } export declare type Tester = (item: any, key?: Key, owner?: any) => boolean; export declare type OperationCreator = (params: any, parentQuery: any, options: Options) => Operation; declare type BasicValueQuery = { $eq?: TValue; $ne?: TValue; $lt?: TValue; $gt?: TValue; $lte?: TValue; $gte?: TValue; $in?: TValue[]; $nin?: TValue[]; $mod?: [number, number]; $exists?: boolean; $regex?: string; $options?: "i" | "g" | "m" | "u"; $type?: Function; $or?: Query[]; $nor?: Query[]; }; declare type ArrayValueQuery = { $elemMatch?: Query; } & BasicValueQuery; declare type Unpacked = T extends (infer U)[] ? U : T; declare type ValueQuery = TValue extends Array ? ArrayValueQuery> : BasicValueQuery; declare type NotObject = string | number | Date | boolean | Array; declare type ShapeQuery = TItemSchema extends NotObject ? {} : { [k in keyof TItemSchema]?: TItemSchema[k] | ValueQuery; }; export declare type Query = ValueQuery & ShapeQuery; export declare abstract class BaseOperation implements Operation { readonly params: TParams; readonly owneryQuery: any; readonly options: Options; success: boolean; done: boolean; constructor(params: TParams, owneryQuery: any, options: Options); protected init(): void; reset(): void; abstract next(item: any, key: Key, parent: any): any; } export declare abstract class GroupOperation extends BaseOperation { protected readonly _children: Operation[]; success: boolean; done: boolean; constructor(params: any, owneryQuery: any, options: Options, _children: Operation[]); /** */ reset(): void; abstract next(item: any, key: Key, owner: any): any; /** */ protected childrenNext(item: any, key: Key, owner: any): void; } export declare class QueryOperation extends GroupOperation { /** */ next(item: any, key: Key, parent: any): void; } export declare class NestedOperation extends GroupOperation { readonly keyPath: Key[]; constructor(keyPath: Key[], params: any, owneryQuery: any, options: Options, children: Operation[]); /** */ next(item: any, key: Key, parent: any): void; /** */ private _nextNestedValue; } export declare const createTester: (a: any, compare: Comparator) => any; export declare class EqualsOperation extends BaseOperation { private _test; init(): void; next(item: any, key: Key, parent: any): void; } export declare const createEqualsOperation: (params: any, owneryQuery: any, options: Options) => EqualsOperation; export declare class NopeOperation extends BaseOperation { next(): void; } export declare const numericalOperationCreator: (createNumericalOperation: OperationCreator) => (params: any, owneryQuery: any, options: Options) => Operation | NopeOperation; export declare const numericalOperation: (createTester: (any: any) => Tester) => (params: any, owneryQuery: any, options: Options) => Operation | NopeOperation; export declare type Options = { operations: { [identifier: string]: OperationCreator; }; compare: (a: any, b: any) => boolean; }; export declare const containsOperation: (query: any) => boolean; export declare const createQueryOperation: (query: any, owneryQuery: any, options: Options) => any; export declare const createQueryTester: (query: Query, { compare, operations }?: Partial) => (item: TItem, key?: Key, owner?: any) => any; export {};