export type Specification = (candidate: T) => boolean; export declare function and(...specs: Specification[]): Specification; export declare function or(...specs: Specification[]): Specification; export declare function not(spec: Specification): Specification; export declare function alwaysTrue(): Specification; export declare function alwaysFalse(): Specification; export declare function propEquals(propertyName: K, expectedValue: T[K]): Specification; export declare function propIn(propertyName: K, values: T[K][]): Specification; export declare function dateRange(propertyName: keyof T, range: { start?: Date; end?: Date; }): Specification; export declare function numericRange(propertyName: keyof T, range: { min?: number; max?: number; }): Specification; export declare function propTruthy(propertyName: keyof T): Specification; export declare function propFalsy(propertyName: keyof T): Specification; export declare function propNullish(propertyName: keyof T): Specification; export declare function propNotNullish(propertyName: keyof T): Specification; export declare function propContains(propertyName: keyof T, value: V): Specification; export declare function spec(predicate: (candidate: T) => boolean): Specification; export declare function filterBy(items: T[], specification: Specification): T[]; export declare function findBy(items: T[], specification: Specification): T | undefined; export declare function countBy(items: T[], specification: Specification): number; export declare function someBy(items: T[], specification: Specification): boolean; export declare function everyBy(items: T[], specification: Specification): boolean;