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
use gc_arena::{Collect, MutationContext, StaticCollect}; use crate::Sequence; #[must_use = "sequences do nothing unless stepped"] #[derive(Debug, Collect)] #[collect(empty_drop)] pub struct Map<S, F>(S, Option<StaticCollect<F>>); impl<S, F> Map<S, F> { pub fn new(s: S, f: F) -> Map<S, F> { Map(s, Some(StaticCollect(f))) } } impl<'gc, S, F, R> Sequence<'gc> for Map<S, F> where S: Sequence<'gc>, F: 'static + FnOnce(S::Output) -> R, { type Output = R; fn step(&mut self, mc: MutationContext<'gc, '_>) -> Option<R> { match self.0.step(mc) { Some(res) => Some(self.1.take().expect("cannot step a finished sequence").0( res, )), None => None, } } } #[must_use = "sequences do nothing unless stepped"] #[derive(Debug, Collect)] #[collect(empty_drop)] pub struct MapWith<S, C, F>(S, Option<(C, StaticCollect<F>)>); impl<S, C, F> MapWith<S, C, F> { pub fn new(s: S, c: C, f: F) -> MapWith<S, C, F> { MapWith(s, Some((c, StaticCollect(f)))) } } impl<'gc, S, C, F, R> Sequence<'gc> for MapWith<S, C, F> where S: Sequence<'gc>, C: Collect, F: 'static + FnOnce(C, S::Output) -> R, { type Output = R; fn step(&mut self, mc: MutationContext<'gc, '_>) -> Option<Self::Output> { match self.0.step(mc) { Some(res) => { let (c, StaticCollect(f)) = self.1.take().expect("cannot step a finished sequence"); Some(f(c, res)) } None => None, } } }