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
use gc_arena::{Collect, MutationContext}; use crate::Sequence; #[must_use = "sequences do nothing unless stepped"] #[derive(Collect)] #[collect(empty_drop)] pub enum FlattenOk<S, I> { First(S), Second(I), } impl<S, I> FlattenOk<S, I> { pub fn new(s: S) -> FlattenOk<S, I> { FlattenOk::First(s) } } impl<'gc, S, I, E, I2> Sequence<'gc> for FlattenOk<S, I> where S: Sequence<'gc, Output = Result<I, E>>, I: Sequence<'gc, Output = Result<I2, E>>, { type Output = Result<I2, E>; fn step(&mut self, mc: MutationContext<'gc, '_>) -> Option<Self::Output> { match self { FlattenOk::First(f) => match f.step(mc) { Some(Ok(s)) => { *self = FlattenOk::Second(s); None } Some(Err(err)) => Some(Err(err)), None => None, }, FlattenOk::Second(s) => s.step(mc), } } }