gc_sequence/
flatten.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 Flatten<'gc, S>
9where
10    S: Sequence<'gc>,
11    S::Output: Sequence<'gc>,
12{
13    First(S),
14    Second(S::Output),
15}
16
17impl<'gc, S> Flatten<'gc, S>
18where
19    S: Sequence<'gc>,
20    S::Output: Sequence<'gc>,
21{
22    pub fn new(s: S) -> Flatten<'gc, S> {
23        Flatten::First(s)
24    }
25}
26
27impl<'gc, S> Sequence<'gc> for Flatten<'gc, S>
28where
29    S: Sequence<'gc>,
30    S::Output: Sequence<'gc>,
31{
32    type Output = <S::Output as Sequence<'gc>>::Output;
33
34    fn step(&mut self, mc: MutationContext<'gc, '_>) -> Option<Self::Output> {
35        match self {
36            Flatten::First(f) => match f.step(mc) {
37                Some(s) => {
38                    *self = Flatten::Second(s);
39                    None
40                }
41                None => None,
42            },
43            Flatten::Second(s) => s.step(mc),
44        }
45    }
46}