gc_sequence/
flatten_result.rs

1use gc_arena::{Collect, MutationContext};
2
3use crate::Sequence;
4
5#[must_use = "sequences do nothing unless stepped"]
6#[derive(Collect)]
7#[collect(no_drop)]
8pub enum FlattenOk<S, I> {
9    First(S),
10    Second(I),
11}
12
13impl<S, I> FlattenOk<S, I> {
14    pub fn new(s: S) -> FlattenOk<S, I> {
15        FlattenOk::First(s)
16    }
17}
18
19impl<'gc, S, I, E, I2> Sequence<'gc> for FlattenOk<S, I>
20where
21    S: Sequence<'gc, Output = Result<I, E>>,
22    I: Sequence<'gc, Output = Result<I2, E>>,
23{
24    type Output = Result<I2, E>;
25
26    fn step(&mut self, mc: MutationContext<'gc, '_>) -> Option<Self::Output> {
27        match self {
28            FlattenOk::First(f) => match f.step(mc) {
29                Some(Ok(s)) => {
30                    *self = FlattenOk::Second(s);
31                    None
32                }
33                Some(Err(err)) => Some(Err(err)),
34                None => None,
35            },
36            FlattenOk::Second(s) => s.step(mc),
37        }
38    }
39}