piccolo 0.3.3

Stackless Lua VM implemented in pure Rust
Documentation
use piccolo::{Callback, CallbackReturn, Executor, Function, Lua, StaticError, Variadic};

#[test]
fn function_compose_bind() -> Result<(), StaticError> {
    let mut lua = Lua::core();

    let executor = lua.try_enter(|ctx| {
        let composed_functions = Function::compose(
            &ctx,
            [
                Callback::from_fn(&ctx, |ctx, _, mut stack| {
                    let i: Variadic<Vec<i64>> = stack.consume(ctx)?;
                    stack.replace(ctx, i.into_iter().sum::<i64>());
                    Ok(CallbackReturn::Return)
                })
                .into(),
                Callback::from_fn(&ctx, |ctx, _, mut stack| {
                    let i: i64 = stack.consume(ctx)?;
                    stack.replace(ctx, i * 2);
                    Ok(CallbackReturn::Return)
                })
                .into(),
                Callback::from_fn(&ctx, |ctx, _, mut stack| {
                    let i: i64 = stack.consume(ctx)?;
                    stack.replace(ctx, i + 1);
                    Ok(CallbackReturn::Return)
                })
                .into(),
                Callback::from_fn(&ctx, |ctx, _, mut stack| {
                    let i: i64 = stack.consume(ctx)?;
                    stack.replace(ctx, i * 3);
                    Ok(CallbackReturn::Return)
                })
                .into(),
            ],
        )
        .bind(&ctx, 1)
        .bind(&ctx, (2, 1));
        Ok(ctx.stash(Executor::start(ctx, composed_functions, 1)))
    })?;

    assert_eq!(lua.execute::<i64>(&executor)?, 33);
    Ok(())
}