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