functional 0.0.7

Functional traits
use hkt::*;

/// Basic functional trait
pub trait Functor: Generic1 {
    /// Apply function to wrapped value
    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()
    }
}