A case study for `reasync`

You mean this won't work?

func throwingFunc() throws {
    print("throwingFunc")
    throw NSError(domain: "", code: 0)
}
func nonthrowingFunc() {
    print("nonThrowingFunc")
}
func proc(closure: () throws -> Void) throws {
    print("throwing version")
    try closure()
}
func proc(closure: () -> Void) {
    print("non throwing version")
    closure()
}
func test() {
    proc { nonthrowingFunc() }
    try! proc { try throwingFunc() }
}
test()