1use typenum::{True,False};
2use super::{Ret,If};
3
4#[derive(Debug,Default)]
5pub struct And;
6defmacro!{ And {
7 ( ) { } => {Ret, @True};
8 (H,T) { H; T } => {If, H, {And; T}, @False};
9}}
10
11#[derive(Debug,Default)]
12pub struct Or;
13defmacro!{ Or {
14 (H,T) { H; T } => {If, H, @True, {Or; T}};
15 ( ) { } => {Ret, @False};
16}}
17
18#[derive(Debug,Default)]
19pub struct Not;
20defun!{ Not {
21 () { _:True } => {Ret, @False = Default::default()};
22 () { _:False } => {Ret, @True = Default::default()};
23}}
24
25#[derive(Debug,Default)]
26pub struct Invert;
27
28defun_nocalc!{() Invert {
29 (Pred) { _:Pred } => {Ret, @Inverted<Pred>};
30}}
31
32#[derive(Debug,Default)]
33pub struct Inverted<P>(P);
34
35defun_nocalc!{(P) Inverted<P> {
36 (P, Args) { ; _:Args } => {Not, {@P; Args}};
37}}
38
39#[derive(Debug,Default)]
40pub struct Yes;
41defun_nocalc!{() Yes {
42 (Args) {; _:Args} => {Ret, @True};
43}}
44
45#[derive(Debug,Default)]
46pub struct No;
47defun_nocalc!{() No {
48 (Args) {; _:Args} => {Ret, @False};
49}}