1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
use hkt::HKT; pub trait Foldable<A>: HKT<A> + Sized { fn fold_left<F>(&self, b: A, f: F) -> A where F: Fn(A, &<Self as HKT<A>>::C) -> A; fn fold_right<F>(&self, b: A, f: F) -> A where F: Fn(&<Self as HKT<A>>::C, A) -> A; } impl<A, B> Foldable<B> for Vec<A> { fn fold_left<F>(&self, b: B, f: F) -> B where F: Fn(B, &<Self as HKT<B>>::C) -> B, { self.iter().fold(b, f) } fn fold_right<F>(&self, b: B, f: F) -> B where F: Fn(&<Self as HKT<B>>::C, B) -> B, { self.iter().rev().fold(b, |x, y| f(y, x)) } }