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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
use gc_arena::{Collect, MutationContext, StaticCollect}; use crate::Sequence; #[must_use = "sequences do nothing unless stepped"] #[derive(Debug, Collect)] #[collect(empty_drop)] pub struct MapOk<S, F>(S, Option<StaticCollect<F>>); impl<S, F> MapOk<S, F> { pub fn new(s: S, f: F) -> MapOk<S, F> { MapOk(s, Some(StaticCollect(f))) } } impl<'gc, S, F, I, E, R> Sequence<'gc> for MapOk<S, F> where S: Sequence<'gc, Output = Result<I, E>>, F: 'static + FnOnce(I) -> R, { type Output = Result<R, E>; fn step(&mut self, mc: MutationContext<'gc, '_>) -> Option<Self::Output> { match self.0.step(mc) { Some(Ok(res)) => Some(Ok(self .1 .take() .expect("cannot step a finished sequence") .0(res))), Some(Err(err)) => Some(Err(err)), None => None, } } } #[must_use = "sequences do nothing unless stepped"] #[derive(Debug, Collect)] #[collect(empty_drop)] pub struct MapOkWith<S, C, F>(S, Option<(C, StaticCollect<F>)>); impl<S, C, F> MapOkWith<S, C, F> { pub fn new(s: S, c: C, f: F) -> MapOkWith<S, C, F> { MapOkWith(s, Some((c, StaticCollect(f)))) } } impl<'gc, S, C, F, I, E, R> Sequence<'gc> for MapOkWith<S, C, F> where S: Sequence<'gc, Output = Result<I, E>>, C: Collect, F: 'static + FnOnce(C, I) -> R, { type Output = Result<R, E>; fn step(&mut self, mc: MutationContext<'gc, '_>) -> Option<Self::Output> { match self.0.step(mc) { Some(Ok(res)) => { let (c, StaticCollect(f)) = self.1.take().expect("cannot step a finished sequence"); Some(Ok(f(c, res))) } Some(Err(err)) => Some(Err(err)), None => None, } } } #[must_use = "sequences do nothing unless stepped"] #[derive(Debug, Collect)] #[collect(empty_drop)] pub struct MapError<S, F>(S, Option<StaticCollect<F>>); impl<S, F> MapError<S, F> { pub fn new(s: S, f: F) -> MapError<S, F> { MapError(s, Some(StaticCollect(f))) } } impl<'gc, S, F, I, E, R> Sequence<'gc> for MapError<S, F> where S: Sequence<'gc, Output = Result<I, E>>, F: 'static + FnOnce(E) -> R, { type Output = Result<I, R>; fn step(&mut self, mc: MutationContext<'gc, '_>) -> Option<Self::Output> { match self.0.step(mc) { Some(Ok(res)) => Some(Ok(res)), Some(Err(err)) => Some(Err(self .1 .take() .expect("cannot step a finished sequence") .0(err))), None => None, } } }