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)
}