vuot 0.0.1

Run recursive async functions without overflowing the stack
Documentation
mod dizzy;

use vuot::{run, Stack, StacklessFn};

fn main() {
    dizzy::block_on(async {
        let n = 40;
        println!("fib(40) = {}", run(Fib(&n)).await);
    });
}

struct Fib<'local>(&'local usize);
impl<'a> StacklessFn<'a, usize> for Fib<'_> {
    async fn call(self, stack: Stack<'a>) -> usize {
        fib(stack, *self.0).await
    }
}

async fn fib(stack: Stack<'_>, n: usize) -> usize {
    if n < 2 {
        n
    } else {
        stack.run(fib(stack, n - 1)).await + stack.run(fib(stack, n - 2)).await
    }
}