rust_fp_categories/
lib.rs

1#![feature(generic_associated_types)]
2#![allow(incomplete_features)]
3
4#[cfg(test)]
5extern crate quickcheck;
6
7#[cfg(test)]
8#[macro_use(quickcheck)]
9extern crate quickcheck_macros;
10
11mod applicative;
12mod apply;
13mod bind;
14mod empty;
15mod foldable;
16mod functor;
17mod monad;
18mod monoid;
19mod pure;
20mod semigroup;
21
22pub use applicative::*;
23pub use apply::*;
24pub use bind::*;
25pub use empty::*;
26pub use foldable::*;
27pub use functor::*;
28pub use monad::*;
29pub use monoid::*;
30pub use pure::*;
31pub use semigroup::*;
32
33#[cfg(test)]
34mod tests {
35    use crate::{Apply, Bind, Foldable, Functor};
36
37    #[test]
38    fn it_works() {
39        let v: Option<i32> = Some(10).bind(|x| Some(20).fmap(|y| x + y));
40        println!("{:?}", v);
41        let v2: Option<i32> = Some(10).ap(Some(|x: &i32| x + 20));
42        println!("{:?}", v2);
43        let vec = vec![1, 3, 5];
44        let n: i32 = vec.fold_left(0, |x, y: &i32| x + y);
45        println!("{:?}", n)
46    }
47}