haskell_bits/
mdo.rs

1// Largely stolen from:
2// https://github.com/TeXitoi/rust-mdo/blob/master/src/lib.rs
3
4#[macro_export]
5macro_rules! mdo {
6    (
7        let $p: pat = $e: expr ; $( $t: tt )*
8    ) => (
9        { let $p = $e ; mdo! { $( $t )* } }
10    );
11
12    (
13        let $p: ident : $ty: ty = $e: expr ; $( $t: tt )*
14    ) => (
15        { let $p: $ty = $e ; mdo! { $( $t )* } }
16    );
17
18    (
19        $p: pat =<< $e: expr ; $( $t: tt )*
20    ) => (
21        bind($e, move |$p : &_| mdo! { $( $t )* } )
22    );
23
24    (
25        $p: ident : $ty: ty =<< $e: expr ; $( $t: tt )*
26    ) => (
27        bind($e, move |$p : &$ty| mdo! { $( $t )* } )
28    );
29
30    (
31        ign $e: expr ; $( $t: tt )*
32    ) => (
33        bind($e, move |_| mdo! { $( $t )* })
34    );
35
36    (
37        ret<$ty: ty> $e: expr ;
38    ) => (
39        lift::<$ty, _>($e)
40    );
41}
42
43#[macro_export]
44macro_rules! mdo_c {
45    (
46        let $p: pat = $e: expr ; $( $t: tt )*
47    ) => (
48        { let $p = $e ; mdo_c! { $( $t )* } }
49    );
50
51    (
52        let $p: ident : $ty: ty = $e: expr ; $( $t: tt )*
53    ) => (
54        { let $p: $ty = $e ; mdo_c! { $( $t )* } }
55    );
56
57    (
58        $p: pat =<< $e: expr ; $( $t: tt )*
59    ) => (
60        bind($e, move |$p : &_| mdo_c! { $( $t )* } )
61    );
62
63    (
64        $p: ident : $ty: ty =<< $e: expr ; $( $t: tt )*
65    ) => (
66        bind($e, move |$p : &$ty| mdo_c! { $( $t )* } )
67    );
68
69    (
70        ign $e: expr ; $( $t: tt )*
71    ) => (
72        bind($e, move |_| mdo_c! { $( $t )* })
73    );
74
75    (
76        ret<$ty: ty> $e: expr ;
77    ) => (
78        lift::<$ty, _>($e)
79    );
80
81    (
82        ret $e: expr ;
83    ) => (
84        lift_c($e)
85    );
86}
87
88#[macro_export]
89macro_rules! ldo {
90    (
91        let $p: pat = $e: expr ; $( $t: tt )*
92    ) => (
93        { let $p = $e ; ldo! { $( $t )* } }
94    );
95
96    (
97        let $p: ident : $ty: ty = $e: expr ; $( $t: tt )*
98    ) => (
99        { let $p: $ty = $e ; ldo! { $( $t )* } }
100    );
101
102    (
103        $p: pat =<< $e: expr ; $( $t: tt )*
104    ) => (
105        lbind($e, move |$p| ldo! { $( $t )* } )
106    );
107
108    (
109        $p: ident : $ty: ty =<< $e: expr ; $( $t: tt )*
110    ) => (
111        lbind($e, move |$p : $ty| ldo! { $( $t )* } )
112    );
113
114    (
115        ign $e: expr ; $( $t: tt )*
116    ) => (
117        lbind($e, move |_| ldo! { $( $t )* })
118    );
119
120    (
121        ret<$ty: ty> $e: expr ;
122    ) => (
123        lift::<$ty, _>($e)
124    );
125}