1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use crate::prelude::Applicative;

impl<'a> Applicative<'a, char> for String {
    type PureT<T> = char where T: 'a;

    fn pure(a: Self::PureT<()>) -> Self::Type<Self::PureT<()>> {
        vec![a]
    }

    fn app<F, B>(self, fs: Self::Type<F>) -> Self::Type<B>
    where
        F: Fn(char) -> B + 'a,
        B: 'a,
    {
        fs.into_iter()
            .flat_map(|f| self.clone().chars().map(f).collect::<Vec<_>>())
            .collect()
    }
}