gc-sequence 0.2.1

a system for encoding safe points for computations running on gc-arena
Documentation
use gc_arena::{ArenaParameters, Collect, Gc};
use gc_sequence::{self as sequence, make_sequencable_arena, SequenceExt, SequenceResultExt};

#[derive(Collect)]
#[collect(no_drop)]
struct TestRoot<'gc> {
    test: Gc<'gc, i32>,
}

make_sequencable_arena!(test_sequencer, TestRoot);
use test_sequencer::Arena as TestArena;

#[test]
fn test_sequencer() {
    let arena = TestArena::new(ArenaParameters::default(), |mc| TestRoot {
        test: Gc::allocate(mc, 42),
    });

    let mut sequence = arena.sequence(|root| {
        sequence::from_fn_with(root.test, |_, test| {
            if *test == 42 {
                Ok(*test + 10)
            } else {
                Err("will not be generated")
            }
        })
        .and_then(|_, r| Ok(r + 12))
        .and_chain(|_, r| Ok(sequence::ok(r - 10)))
        .then(|_, res| res.expect("should not be error"))
        .chain(|_, r| sequence::done(r + 10))
        .map(|r| sequence::done(r - 60))
        .flatten()
        .boxed()
    });

    loop {
        match sequence.step() {
            Ok((_, output)) => {
                assert_eq!(output, 4);
                return;
            }
            Err(s) => sequence = s,
        }
    }
}