use crate::{define, primitives};
pub type True = primitives::FirstOf;
pub type False = primitives::SecondOf;
define! {
pub fn And ::= {Lhs. Rhs. { Lhs, Rhs, Lhs }} where
Lhs: Rhs,
{Lhs, Rhs}: Lhs;
pub fn Or ::= {Lhs. Rhs. { Lhs, Lhs, Rhs }} where
Lhs: Lhs,
{Lhs, Lhs}: Rhs;
pub fn Xor ::= {Lhs. Rhs. { Lhs, {Not, Rhs}, Rhs }} where
Not: Rhs,
Lhs: { Not, Rhs },
{Lhs, { Not, Rhs }}: Rhs;
pub fn Not ::= {Value. { Value, False, True }} where
Value: False,
{Value, False}: True;
pub fn If ::= {Predicate. Truthy. Falsy. { Predicate, Truthy, Falsy }} where
Predicate: Truthy,
{Predicate, Truthy}: Falsy;
}