At first glance, it looks like Rust's channels with a polymorphic type -- when you receive from a channel, you do match and write branches for each variant of the type.
But I wonder if this can be a better abstraction than async. (And whether I can build something like this in existing Rust.)