ty_ops/classes/functor.rs
1use std::marker::PhantomData;
2use crate::{Eval, Lambda, Type, Value};
3
4pub trait Functor<T: Type>: Type {
5 type HKT<A: Type>: Type;
6}
7
8pub type Map<F, Fun> = Eval<MapOn<<Fun as Value>::Type, F>, Fun>;
9
10pub struct MapOn<T: Type, F: Value>(PhantomData<(T, F)>);
11
12impl<
13 A: Type, B: Type,
14 T: Type + Functor<A>,
15 F: Value<Type = Lambda<A, B>>
16> Value for MapOn<T, F> {
17 type Type = Lambda<T, T::HKT<B>>;
18}
19