/** * Predicate that always returns true */ export const always = (...args: any[]) => true; /** * Predicate that always returns false */ export const never = (...args: any[]) => false; /** * Negate a predicate */ export function not( predicate: (...args: A) => boolean, ): (...args: A) => boolean { return (...args) => !predicate(...args); } /** * Apply a boolean "and" to merge predicates */ export function and( ...predicates: ((...args: A) => boolean)[] ): (...args: A) => boolean { return (...args) => { for (let p of predicates) { if (!p(...args)) { return false; } } return true; }; } /** * Apply a boolean "or" to merge predicates */ export function or( ...predicates: ((...args: A) => boolean)[] ): (...args: A) => boolean { return (...args) => { for (let p of predicates) { if (p(...args)) { return true; } } return false; }; }