Created
January 12, 2021 05:29
-
-
Save Luiz-Monad/26d9f35163d394a8406501e31883522e to your computer and use it in GitHub Desktop.
timemachine.fs
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
type AsyncResultBuilder ( timeMachine ) = | |
let mutable map = emptyMap () | |
let mkOperation generator = | |
let intercept = generator () | |
let cmds = side_effect_connection_ctx () | |
let cmdList = sql_to_send cmds | |
map <- map @ cmdList | |
intercept | |
let collect () = async { | |
return! AsyncSeq.iter <| fun cmd -> async { | |
let timestamp t = typeof<TimeStamp>.IsAssignableFrom t | |
let dt = lens_for cmd |> Seq.filter timestamp | |
let t = - timeMachine.warp + timeMachine.lastWarp | |
let cmds = side_effect_connection_ctx () | |
cmds.run cmd | |
let sql = mk_sql_timestamp dt <% dt - t %> | |
cmds.run <| sql cmd.param | |
timeMachine.commit () | |
map <- emptyMap () | |
} | |
} | |
member __.Return value : Async<Result<'a option, 'b>> = ok value | |
member __.ReturnFrom (asyncResult: Async<Result<'a option, 'b>>) = asyncResult | |
member __.Zero () : Async<Result<unit option, 'b>> = __.Return () | |
member __.Delay ( generator: unit -> Async<Result<'a option, 'b>> ) : Async<Result<'a option, 'b>> = | |
mkOperation async.Delay generator | |
member __.Bind ( asyncResult: Async<Result<'a option, 'c>>, binder: 'a -> Async<Result<'b option, 'c>> ) : Async<Result<'b option, 'c>> = | |
asyncResult |> bind binder | |
member __.TryWith ( asyncResult: Async<Result<'a option, 'b>>, catchHandler: exn -> Async<Result<'a option, 'b>> ) : Async<Result<'a option, 'b>> = | |
async.TryWith ( asyncResult, catchHandler ) | |
member __.TryFinally ( asyncResult : Async<Result<'a option, 'b>>, compensation: unit -> unit ) : Async<Result<'a option, 'b>> = | |
async.TryFinally ( asyncResult, compensation ) | |
member __.Using ( resource: 'T when 'T :> System.IDisposable, binder: 'T -> Async<Result<'a option, 'b>> ) : Async<Result<'a option, 'b>> = | |
collect async.Using ( resource, binder ) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment