Используйте комбинаторы для очистки 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"
}