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