1use std::marker::PhantomData;
2use crate::*;
3use crate::classes::*;
4
5#[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
27impl 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#[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#[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
92pub 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