Skip to content

Instantly share code, notes, and snippets.

@Luiz-Monad
Created January 12, 2021 05:29
Show Gist options
  • Save Luiz-Monad/26d9f35163d394a8406501e31883522e to your computer and use it in GitHub Desktop.
Save Luiz-Monad/26d9f35163d394a8406501e31883522e to your computer and use it in GitHub Desktop.
timemachine.fs
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