let greetUser async [arity:1]userId =
  ((let name = await (getUserName userId) in
    ({js|Hello |js} ++ name) ++ {js|!|js})
  [@res.braces ])
;;async fun [arity:1]() -> 123
let fetch = ((async fun [arity:1]url -> browserFetch url)[@res.braces ])
let fetch2 =
  (((async fun [arity:1]url -> browserFetch url);
    (async fun [arity:1]url -> browserFetch2 url))
  [@res.braces ])
let async =
  ((let f = async () in
    () -> async;
    async ();
    async.async;
    { async = (async.(async)) };
    (result -> async) -> (mapAsync (fun [arity:1]a -> doStuff a)))
  [@res.braces ])
let f =
  ((if isPositive
    then async fun [arity:2]a -> fun b -> (a + b : int)
    else (async fun [arity:2]c -> fun d -> (c - d : int)))
  [@res.ternary ])
let foo = async ~a:34
let bar async [arity:1]~a  = a + 1
let ex1 = (await 3) + (await 4)
let ex2 = (await 3) ** (await 4)
let ex3 = await (foo -> (bar ~arg))
let ex4 = await ((foo.bar).baz)
let attr1 = ((async fun [arity:1]x -> x + 1)[@a ])
let attr2 = ((fun (type a) ->
  async fun [arity:1]() -> fun (type b) -> fun (type c) ->
    fun [arity:1]x -> 3)
  [@a ])
let attr3 = ((fun (type a) ->
  fun [arity:1]() -> fun (type b) -> fun (type c) ->
    async fun [arity:1]x -> 3)
  [@a ])
let attr4 = ((fun (type a) ->
  fun [arity:1]() -> ((fun (type b) -> fun (type c) ->
    async fun [arity:1]x -> 3)[@b ]))
  [@a ])
let (attr5 : int) = ((fun (type a) -> fun (type b) -> fun (type c) ->
  async fun [arity:1]() -> fun [arity:1](x : a) -> x)[@a ][@b ])