]> git.lizzy.rs Git - rust.git/blob - src/test/ui/impl-trait/example-st.rs
Rollup merge of #98441 - calebzulawski:simd_as, r=oli-obk
[rust.git] / src / test / ui / impl-trait / example-st.rs
1 // run-pass
2
3 struct State;
4 type Error = ();
5
6 trait Bind<F> {
7     type Output;
8     fn bind(self, f: F) -> Self::Output;
9 }
10
11 fn bind<T, U, A, B, F>(mut a: A, mut f: F)
12                        -> impl FnMut(&mut State) -> Result<U, Error>
13 where F: FnMut(T) -> B,
14       A: FnMut(&mut State) -> Result<T, Error>,
15       B: FnMut(&mut State) -> Result<U, Error>
16 {
17     move |state | {
18         let r = a(state)?;
19         f(r)(state)
20     }
21 }
22
23 fn atom<T>(x: T) -> impl FnMut(&mut State) -> Result<T, Error> {
24     let mut x = Some(x);
25     move |_| x.take().map_or(Err(()), Ok)
26 }
27
28 fn main() {
29     assert_eq!(bind(atom(5), |x| atom(x > 4))(&mut State), Ok(true));
30 }