1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
use crate::functor::Functor; use crate::hkt::{HKT, HKT3}; pub trait Apply<A, F, B>: Functor<A, B> + HKT3<A, F, B> where F: FnOnce(A) -> B, { fn ap(self, f: <Self as HKT3<A, F, B>>::Target2) -> <Self as HKT<A, B>>::Target; } impl<A, F, B> Apply<A, F, B> for Option<A> where F: FnOnce(A) -> B, { fn ap(self, f: Self::Target2) -> Self::Target { self.and_then(|v| f.map(|z| z(v))) } }