export interface ISpecification<T = unknown> {
    isSatisfiedBy(candidate: T): boolean;
    and(other: ISpecification<T>): ISpecification<T>;
    andNot(other: ISpecification<T>): ISpecification<T>;
    or(other: ISpecification<T>): ISpecification<T>;
    orNot(other: ISpecification<T>): ISpecification<T>;
    not(): ISpecification<T>;
}
export declare abstract class CompositeSpecification<T = unknown> implements ISpecification<T> {
    abstract isSatisfiedBy(candidate: T): boolean;
    and(other: ISpecification<T>): ISpecification<T>;
    andNot(other: ISpecification<T>): ISpecification<T>;
    or(other: ISpecification<T>): ISpecification<T>;
    orNot(other: ISpecification<T>): ISpecification<T>;
    not(): ISpecification<T>;
}
export declare class AndSpecification<T> extends CompositeSpecification<T> {
    private leftCondition;
    private rightCondition;
    constructor(leftCondition: ISpecification<T>, rightCondition: ISpecification<T>);
    isSatisfiedBy(candidate: T): boolean;
}
export declare class AndNotSpecification<T> extends CompositeSpecification<T> {
    private leftCondition;
    private rightCondition;
    constructor(leftCondition: ISpecification<T>, rightCondition: ISpecification<T>);
    isSatisfiedBy(candidate: T): boolean;
}
export declare class OrSpecification<T> extends CompositeSpecification<T> {
    private leftCondition;
    private rightCondition;
    constructor(leftCondition: ISpecification<T>, rightCondition: ISpecification<T>);
    isSatisfiedBy(candidate: T): boolean;
}
export declare class OrNotSpecification<T> extends CompositeSpecification<T> {
    private leftCondition;
    private rightCondition;
    constructor(leftCondition: ISpecification<T>, rightCondition: ISpecification<T>);
    isSatisfiedBy(candidate: T): boolean;
}
export declare class NotSpecification<T> extends CompositeSpecification<T> {
    private wrapped;
    constructor(wrapped: ISpecification<T>);
    isSatisfiedBy(candidate: T): boolean;
}
export declare class Spec<T = unknown> extends CompositeSpecification<T> {
    #private;
    constructor(expression: (candidate: T) => boolean);
    isSatisfiedBy(candidate: T): boolean;
}
