ty_ops/
boolean.rs

1use std::marker::PhantomData;
2use crate::*;
3use crate::classes::*;
4
5// def
6#[derive(Copy, Clone, Default)]
7pub struct True;
8
9#[derive(Copy, Clone, Default)]
10pub struct False;
11
12#[derive(Copy, Clone, Default)]
13pub struct Bool;
14
15impl Type for Bool {}
16
17impl Eq for Bool {}
18
19impl Value for True {
20    type Type = Bool;
21}
22
23impl Value for False {
24    type Type = Bool;
25}
26
27// eq
28impl App<True> for EqTo<True> {
29    type Result = True;
30}
31
32impl App<False> for EqTo<False> {
33    type Result = True;
34}
35
36impl App<True> for EqTo<False> {
37    type Result = False;
38}
39
40impl App<False> for EqTo<True> {
41    type Result = False;
42}
43
44// neg
45#[derive(Copy, Clone, Default)]
46pub struct Neg;
47
48impl Value for Neg {
49    type Type = Lambda<Bool, Bool>;
50}
51
52impl App<True> for Neg {
53    type Result = False;
54}
55
56impl App<False> for Neg {
57    type Result = True;
58}
59
60// lambda branch
61#[derive(Copy, Clone, Default)]
62pub struct LambdaBranch<Fa: Value, Pa: Value, Fb: Value, Pb: Value>(PhantomData<(Fa, Pa, Fb, Pb)>);
63
64impl<
65    T: Type, A: Type, B: Type,
66    Fa: Value<Type=Lambda<A, T>>, Pa: Value<Type=A>,
67    Fb: Value<Type=Lambda<B, T>>, Pb: Value<Type=B>
68> Value for LambdaBranch<Fa, Pa, Fb, Pb> {
69    type Type = Lambda<Bool, T>;
70}
71
72impl<
73    T: Type, A: Type, B: Type,
74    Fa: Value<Type=Lambda<A, T>> + App<Pa, Result=R>,
75    Pa: Value<Type=A>,
76    Fb: Value<Type=Lambda<B, T>>, Pb: Value<Type=B>,
77    R: Value<Type=T>,
78> App<True> for LambdaBranch<Fa, Pa, Fb, Pb> {
79    type Result = R;
80}
81
82impl<
83    T: Type, A: Type, B: Type,
84    Fa: Value<Type=Lambda<A, T>>, Pa: Value<Type=A>,
85    Fb: Value<Type=Lambda<B, T>> + App<Pb, Result=R>,
86    Pb: Value<Type=B> ,
87    R: Value<Type=T>,
88> App<False> for LambdaBranch<Fa, Pa, Fb, Pb> {
89    type Result = R;
90}
91
92// or
93pub type Or<A, B> = Eval<OrOn<A>, B>;
94
95pub struct OrOn<T: Value<Type=Bool>>(PhantomData<T>);
96
97impl<T: Value<Type=Bool>> Value for OrOn<T> {
98    type Type = Lambda<Bool, Bool>;
99}
100
101impl<T: Value<Type=Bool>> App<True> for OrOn<T> {
102    type Result = True;
103}
104
105impl App<False> for OrOn<True> {
106    type Result = True;
107}
108
109impl App<False> for OrOn<False> {
110    type Result = False;
111}
112
113#[derive(Copy, Clone, Default)]
114pub struct WhenMaybe<V: Value>(PhantomData<V>);
115
116impl<T: Type, V: Value<Type=T>> Value for WhenMaybe<V> {
117    type Type = Lambda<Bool, Maybe<T>>;
118}
119
120impl<T: Type, V: Value<Type=T>> App<True> for WhenMaybe<V> {
121    type Result = Just<V>;
122}
123
124impl<T: Type, V: Value<Type=T>> App<False> for WhenMaybe<V> {
125    type Result = Nothing<T>;
126}
127
128#[derive(Copy, Clone, Default)]
129pub struct WhenMaybeF<V: Value>(PhantomData<V>);
130
131impl<T: Type, V: Value<Type=T>> Value for WhenMaybeF<V> {
132    type Type = Lambda<Bool, Maybe<T>>;
133}
134
135impl<T: Type, V: Value<Type=T>> App<False> for WhenMaybeF<V> {
136    type Result = Just<V>;
137}
138
139impl<T: Type, V: Value<Type=T>> App<True> for WhenMaybeF<V> {
140    type Result = Nothing<T>;
141}
142
143