use hkt::*;
pub trait Functor: Generic1 {
fn fmap<Y, F>(self, f: F) -> rebind1!(Self, Y)
where Self::Unit: Rebind1<Y>,
generic1!(Self): Sized,
F: Fn(generic1!(Self)) -> Y;
}
impl<T> Functor for Option<T> where T: Sized {
fn fmap<Y, F>(self, f: F) -> rebind1!(Self, Y)
where F: Fn(T) -> Y
{
match self {
Some(value) => Some(f(value)),
None => None,
}
}
}
impl<T, E> Functor for Result<T, E> {
fn fmap<Y, F>(self, f: F) -> rebind1!(Self, Y)
where F: Fn(generic1!(Self)) -> Y
{
match self {
Ok(value) => Ok(f(value)),
Err(e) => Err(e),
}
}
}
impl<T> Functor for Vec<T> {
fn fmap<Y, F>(self, f: F) -> rebind1!(Self, Y)
where F: Fn(T) -> Y
{
self.into_iter().map(f).collect()
}
}