Created
August 8, 2017 06:54
-
-
Save nojaf/7491d27e84e228646450ac65df2036e6 to your computer and use it in GitHub Desktop.
ResultBuilder
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module Result = | |
type Result<'TResult, 'TError> = | |
| Ok of 'TResult | |
| Error of 'TError | |
let ifNone (error : 'TError) = function | |
| Some (o) -> Ok o | |
| None -> Error error | |
let map f = function | |
| Ok v -> f v | |
| Error e -> Error e | |
let bind m f = | |
match m with | |
| Ok v -> f v | |
| Error e -> Error e | |
let retn v = Ok v | |
let retnFrom v = v | |
let tryResult (body, err) = | |
try | |
retn <| body() | |
with e -> Error err | |
type ResultBuilder () = | |
member __.Zero () = Error | |
member __.Bind (m , f) = bind m f | |
member __.Return (v) = retn v | |
member __.ReturnFrom (v) = retnFrom v | |
member __.Delay (f) = fun () -> f () | |
member __.Run (f) = f() | |
member __.TryWith (body, handler) = | |
try | |
__.Run body | |
with e -> handler e | |
member __.TryFinally (body, handler) = | |
try | |
__.Run body | |
finally | |
handler () | |
let result = ResultBuilder() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment