ty_ops/
lambda.rs

1use std::marker::PhantomData;
2use crate::*;
3
4
5#[derive(Copy, Clone, Default)]
6pub struct Lambda<A: Type, B: Type>(PhantomData<(A, B)>);
7
8impl<A: Type, B: Type> Type for Lambda<A, B> {}
9
10pub trait App<Ia: Value>: Value<Type=Lambda<<Ia as Value>::Type, <Self::Result as Value>::Type>> {
11    type Result: Value;
12}
13
14impl Type for () {}
15impl Value for () {
16    type Type = ();
17}
18
19pub type Eval<F, P> = <F as App<P>>::Result;
20
21pub struct Id<T: Type>(PhantomData<T>);
22
23impl<T: Type> Value for Id<T> {
24    type Type = Lambda<T, T>;
25}
26
27impl<T: Type, I: Value<Type=T>> App<I> for Id<T> {
28    type Result = I;
29}
30
31pub struct Compose<F: Value, G: Value>(PhantomData<(F, G)>);
32
33impl<A: Type, B: Type, C: Type, F: Value<Type=Lambda<A, B>>, G: Value<Type=Lambda<B, C>>> Value for Compose<F, G> {
34    type Type = Lambda<A, C>;
35}
36
37impl<
38    A: Type, B: Type, C: Type,
39    F: Value<Type=Lambda<A, B>>, G: Value<Type=Lambda<B, C>>,
40    Ia: Value<Type=A>, Ib: Value<Type=B>, Ic: Value<Type=C>
41> App<Ia> for Compose<F, G>
42    where
43        F: App<Ia, Result=Ib>,
44        G: App<Ib, Result=Ic>
45{
46    type Result = Ic;
47}