// Structured concurrency in Hew: a scope owns its child tasks and joins them
// all before the scope expression returns. Tasks are forked with `fork { ... }`
// and run on real OS threads; the enclosing `scope { }` is the join boundary.
//
// Constraints in this build: spawning happens inside an actor handler (which
// carries the execution context); each forked function is a zero-argument,
// unit-returning free function. Nested scopes compose, and an empty
// `after(d) {}` arms a cancellation deadline on the surrounding scope.

fn fetch_orders() {
    println("fetched orders");
}

fn fetch_inventory() {
    println("fetched inventory");
}

fn settle() {
    println("reconciled");
}

actor _Pipeline {
    receive fn run() -> i64 {
        // Outer scope: two siblings fork concurrently and BOTH join here.
        scope {
            after(5s) {}
            fork {
                fetch_orders();
            }
            fork {
                fetch_inventory();
            }
            // Nested scope: its own child joins before the outer scope drains.
            scope {
                fork {
                    settle();
                }
            };
        };
        0
    }
}

fn main() -> i64 {
    let p = spawn _Pipeline;
    match await p.run() {
        Ok(code) => code,
        Err(_e) => 1,
    }
}
