Advertisement
Guest User

Untitled

a guest
Mar 28th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 2.31 KB | None | 0 0
  1. module Prelude
  2.  
  3. module Async =
  4.     let map f x = async {
  5.         let! x' = x
  6.  
  7.        return f x'
  8.     }
  9.  
  10.     let bind f x = async {
  11.          let! x' = x
  12.  
  13.         return! f x'
  14.     }
  15.  
  16.     let lift a = async { return a }
  17.  
  18. module Result =
  19.     let orFail = function
  20.         | Ok x -> x
  21.         | Error e -> failwith e
  22.  
  23.     let apply a f =
  24.         match a, f with
  25.         | Ok v, Ok x -> Ok (x v)
  26.         | _, Error e -> Error e
  27.         | Error e, _ -> Error e
  28.  
  29.     let retn = Ok
  30.  
  31.     let traverse f c =
  32.         let (<*>) f a = apply a f
  33.         let initialState = retn []
  34.         let cons head tail = head :: tail
  35.  
  36.         let folder head tail =
  37.             retn cons <*> (f head) <*> tail
  38.  
  39.         List.foldBack folder c initialState
  40.  
  41.     let isOk = function | Ok _ -> true | _ -> false
  42.     let isError = function | Error _ -> true | _ -> false
  43.  
  44. module AsyncResult =
  45.     let bind f a = async {
  46.         let! a' = a
  47.  
  48.        return!
  49.            match a' with
  50.             | Ok v -> f v
  51.             | Error e -> Async.lift (Error e)
  52.     }
  53.  
  54.     let map f a = async {
  55.         let! a' = a
  56.  
  57.        return
  58.            match a' with
  59.             | Ok v -> Ok (f v)
  60.             | Error e -> Error e
  61.     }
  62.     let apply a f = async {
  63.       let! a' = a
  64.      let! f' = f
  65.  
  66.       return
  67.           match a', f' with
  68.           | Ok v, Ok x -> Ok (x v)
  69.           | _, Error e -> Error e
  70.           | Error e, _ -> Error e
  71.     }
  72.  
  73.     let retn x = x |> Ok |> Async.lift
  74.  
  75.     let traverse f c =
  76.         let (<*>) f a = apply a f
  77.         let initialState = retn []
  78.         let cons head tail = head :: tail
  79.         let folder head tail =
  80.             retn cons <*> (f head) <*> tail
  81.         List.foldBack folder c initialState
  82.  
  83.     let traverseParallel f c = async {
  84.         let! results = c |> List.map f |> Async.Parallel
  85.  
  86.         return
  87.             if results |> Array.exists Result.isError |> not
  88.             then results |> Array.map Result.orFail |> Array.toList |> Ok
  89.             else results |> Array.find Result.isError |> Result.map (fun _ -> [])
  90.     }
  91.  
  92.  
  93. module Option =
  94.     let toResult error = function
  95.         | Some x -> Ok x
  96.         | None -> Error error
  97.  
  98. module Seq =
  99.     let noneIfEmpty s = if Seq.isEmpty s then None else Some s
  100.  
  101. module Tuple2 =
  102.     let uncurry f (x, y) = f x y
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement