import { curry, Is, Predicate } from '@typed/lambda' /** * Returns true if both predicates return true. * @param predicate1 :: (a -> boolean) * @param predicate2 :: (a -> boolean) * @param value :: a * @returns :: boolean */ export const and: { (predicate1: Is, predicate2: Is, value: unknown): value is A & B (predicate1: Is, predicate2: Is): (value: unknown) => value is A & B (predicate1: Is): { (predicate2: Is, value: unknown): value is A & B (predicate2: Is): (value: unknown) => value is A & B } (predicate1: Predicate, predicate2: Predicate, value: A): boolean (predicate1: Predicate, predicate2: Predicate): Predicate (predicate1: Predicate): { (predicate2: Predicate, value: A): boolean (predicate2: Predicate): Predicate } } = curry(__and) as { (predicate1: Is, predicate2: Is, value: C): value is A & B (predicate1: Is, predicate2: Is): (value: C) => value is A & B (predicate1: Is): { (predicate2: Is, value: C): value is A & B (predicate2: Is): (value: C) => value is A & B } (predicate1: Predicate, predicate2: Predicate, value: A): boolean (predicate1: Predicate, predicate2: Predicate): Predicate (predicate1: Predicate): { (predicate2: Predicate, value: A): boolean (predicate2: Predicate): Predicate } } function __and(predicate1: Predicate, predicate2: Predicate, value: A): boolean { return predicate1(value) && predicate2(value) }