ty_ops/
product.rs

1use std::marker::PhantomData;
2use crate::*;
3
4impl<A: Type, B: Type> Type for (A, B) {}
5
6impl<TA: Type, TB: Type, A: Value<Type=TA>, B: Value<Type=TB>> Value for (A, B) {
7    type Type = (TA, TB);
8}
9
10pub struct Fst<A: Type, B: Type>(PhantomData<(A, B)>);
11pub struct Snd<A: Type, B: Type>(PhantomData<(A, B)>);
12
13impl<A: Type, B: Type> Value for Fst<A, B> {
14    type Type=Lambda<(A, B), A>;
15}
16
17impl<A: Type, B: Type, Ia: Value<Type=A>, Ib: Value<Type=B>> App<(Ia, Ib)> for Fst<A, B>
18{
19    type Result = Ia;
20}
21
22impl<A: Type, B: Type> Value for Snd<A, B> {
23    type Type=Lambda<(A, B), B>;
24}
25
26impl<A: Type,  B: Type, Ia: Value<Type=A>, Ib: Value<Type=B>> App<(Ia, Ib)> for Snd<A, B>
27    where A: TypeOf<Ia>,
28          B: TypeOf<Ib>
29{
30    type Result = Ib;
31}
32
33