///|
pub(all) type Prediate[A] ((A) -> Bool, &Show)
///|
pub fn[A] Prediate::to_string(self : Prediate[A]) -> String {
"Prediate(\{self.inner().1.to_string()})"
}
///|
pub impl[A] Show for Prediate[A] with output(
breaker : Prediate[A],
logger : &Logger
) -> Unit {
logger.write_string(breaker.to_string())
}
///|
pub impl[A] Alt for Prediate[A] with lor(self, orw) -> Prediate[A] {
Prediate(
(
fn(arg) { (self.inner().0)(arg) || (orw.inner().0)(arg) },
"(\{self.inner().1} | \{orw.inner().1})",
),
)
}
///|
pub fn[A] Prediate::land(self : Prediate[A], orw : Prediate[A]) -> Prediate[A] {
Prediate(
(
fn(arg) { (self.inner().0)(arg) && (orw.inner().0)(arg) },
"(\{self.inner().1} * \{orw.inner().1})",
),
)
}
///|
pub fn[A] Prediate::op_neg(self : Prediate[A]) -> Prediate[A] {
Prediate((fn(arg) { (self.inner().0)(arg) |> not }, "!(\{self.inner().1})"))
}
///|
pub fn[A] Prediate::op_get(self : Prediate[A], arg : A) -> Bool {
(self.inner().0)(arg)
}