///|
pub typealias Reader[A, Bool] as Predicate[A]
///|
pub typealias Reader[A, B?] as Refinement[A, B]
///|
pub fn[A] Predicate::not(pred : Predicate[A]) -> Predicate[A] {
pred.map(not)
}
///|
pub fn[A] Predicate::to_refinement(pred : Predicate[A]) -> Refinement[A, A] {
a => if pred.read(a) { Some(a) } else { None }
}
///|
pub fn[A] Predicate::to_refinement_rev(pred : Predicate[A]) -> Refinement[A, A] {
pred.not().to_refinement()
}