Sorry, I needed to add a sleep to get the behavior I wanted. Now it just prints nothing.
What I mean is I assume any real program is not going to be creating and destroying event loops any time they want to do something Async and that they'll essentially run main in a top level Async do. In fact it seems like that's the only safe thing to do with this library because the following snippet changes semantics depending on whether it's nested in an existing event loop or not.
results = []
Async do
sleep 10
results << "Hello"
end
puts results
So it seems like you'll pretty much always have to have an explicit wait before you can get your results in 99% of cases.