Используйте комбинаторы для очистки mapJsonAsync в Suave.io

В suave.io есть функция mapJson:

let mapJson (f: 'a -> 'b) =
  request(fun r ->
    f (fromJson r.rawForm) 
    |> toJson
    |> Successful.ok 
    >=> Writers.setMimeType "application/json")

Есть ли способ сделать асинхронную версию аналогичным образом, используя комбинаторы? Я могу написать это вручную следующим образом

let mapJsonAsync (f: 'a -> Async<'b>) (ctx: HttpContext) =
  async {
    let! x = f(fromJson ctx.request.rawForm)
    let resp = Successful.ok (toJson x) >>= Writers.setMimeType "application/json"
    return! resp ctx
  }

но было бы лучше не иметь явного определения ctx или промежуточные значения.

1 ответ

Я не вижу никакого способа обойти это. Последнее выражение можно немного упростить.

let mapJsonAsync (f: 'a -> Async<'b>) =
  fun (ctx : HttpContext) ->
    async{
      let! result = f (fromJson ctx.request.rawForm)
      return Successful.ok (toJson result ) ctx >>= Writers.setMimeType "application/json"
    }
Другие вопросы по тегам