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))
    }
}