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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
use std::rc::Rc; pub trait Pure { type Elm; type M<U>; fn pure(value: Self::Elm) -> Self::M<Self::Elm>; fn unit() -> Self::M<()>; } macro_rules! pure_numeric_impl { ($($t:ty)*) => ($( impl Pure for $t { type Elm = $t; type M<U> = U; fn pure(value: Self::Elm) -> Self::M<Self::Elm> { value } fn unit() -> Self::M<()> { () } } )*) } pure_numeric_impl! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 f32 f64 } impl<A> Pure for Rc<A> { type Elm = A; type M<U> = Rc<U>; fn pure(value: Self::Elm) -> Self::M<Self::Elm> { Rc::new(value) } fn unit() -> Self::M<()> { Rc::new(()) } } impl<A> Pure for Box<A> { type Elm = A; type M<U> = Box<U>; fn pure(value: Self::Elm) -> Self::M<Self::Elm> { Box::new(value) } fn unit() -> Self::M<()> { Box::new(()) } } impl<A> Pure for Option<A> { type Elm = A; type M<U> = Option<U>; fn pure(value: Self::Elm) -> Self::M<Self::Elm> { Some(value) } fn unit() -> Self::M<()> { Some(()) } } impl<A, E> Pure for Result<A, E> { type Elm = A; type M<U> = Result<U, E>; fn pure(value: Self::Elm) -> Self::M<Self::Elm> { Ok(value) } fn unit() -> Self::M<()> { Ok(()) } } impl<A> Pure for Vec<A> { type Elm = A; type M<U> = Vec<U>; fn pure(value: Self::Elm) -> Self::M<Self::Elm> { vec![value] } fn unit() -> Self::M<()> { vec![()] } }