Skip to content

Instantly share code, notes, and snippets.

@michael-newton-15below
Created January 18, 2013 16:31
Show Gist options
  • Save michael-newton-15below/4565838 to your computer and use it in GitHub Desktop.
Save michael-newton-15below/4565838 to your computer and use it in GitHub Desktop.
Corrected builder implementation to use a lazy continuation style computational expression.
type TestErrorBuilder () =
member this.Bind (expr, func) =
try
match expr () with
| None -> fun () -> None
| Some r ->
func r
with
| _ as e ->
printfn "%A" e
fun () -> None
member this.Delay (f: unit -> AuditedProcess<'U>) : AuditedProcess<'U> =
this.Bind (this.Return (), f)
member this.Return<'T> (value : 'T) : AuditedProcess<'T> =
fun () -> Some value
member this.ReturnFrom (value) =
value
member this.TryFinally (expr, comp) =
try expr
finally comp ()
member this.Using (res : #System.IDisposable, expr) =
this.TryFinally(expr res, fun () -> res.Dispose())
member this.Zero () =
fun () -> None
interface IAuditBuilder with
member this.Bind (expr, func) = this.Bind (expr, func)
member this.Delay (f) = this.Delay (f)
member this.Return (value) = this.Return (value)
member this.ReturnFrom (value) = this.ReturnFrom(value)
member this.TryFinally (expr, comp) = this.TryFinally (expr, comp)
member this.Using (res : #System.IDisposable, expr) = this.Using (res, expr)
member this.Zero () = this.Zero ()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment