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
28
29
30
31
32
33
34
35
36
37
38
39
extern crate futures;
#[cfg(test)] #[macro_use] extern crate mdo;
#[cfg(test)] extern crate futures_cpupool;

pub mod future {
    use futures::future::*;

    pub fn bind<T, E, TF: Future<Item=T, Error=E> + Sized, IFU: IntoFuture<Error = E>, F: FnOnce(T) -> IFU>(m: TF, f: F) -> AndThen<TF, IFU, F> {
        m.and_then(f)
    }

    pub fn ret<T, E>(x: T) -> FutureResult<T, E> {
        ok::<T, E>(x)
    }
}

#[cfg(test)]
mod tests {
    use futures::Future;
    use futures::future::ok;
    use futures_cpupool::CpuPool;
    use super::future::{bind, ret};

    #[test]
    fn future_mdo() {
        let pool = CpuPool::new_num_cpus();

        let get_num = ok::<u32, String>(42);

        let res = mdo! {
            arg =<< get_num;
            ret ret(arg * 2)
        };

        let val = pool.spawn(res);

        assert_eq!(val.wait().unwrap(), 84);
    }
}