]> git.lizzy.rs Git - rust.git/blob - tests/ui/try-trait/try-as-monad.rs
Rollup merge of #103236 - tspiteri:redoc-int-adc-sbb, r=m-ou-se
[rust.git] / tests / ui / try-trait / try-as-monad.rs
1 // run-pass
2
3 #![feature(try_trait_v2)]
4
5 use std::ops::Try;
6
7 fn monad_unit<T: Try>(x: <T as Try>::Output) -> T {
8     T::from_output(x)
9 }
10
11 fn monad_bind<T1: Try<Residual = R>, T2: Try<Residual = R>, R>(
12     mx: T1,
13     f: impl FnOnce(<T1 as Try>::Output) -> T2)
14 -> T2 {
15     let x = mx?;
16     f(x)
17 }
18
19 fn main() {
20     let mx: Option<i32> = monad_unit(1);
21     let my = monad_bind(mx, |x| Some(x + 1));
22     let mz = monad_bind(my, |x| Some(-x));
23     assert_eq!(mz, Some(-2));
24 }