Use a maybe monad to be able abort an analysis.
[master-thesis.git] / Parasitemia / ParasitemiaCore / Types.fs
index 917e7d8..e2accb7 100644 (file)
@@ -59,4 +59,29 @@ type Line (a: float32, b: float32) =
     member this.A = a
     member this.B = b
 
+type MaybeBuilder () =
+    member this.Bind (x, f) =
+        match x with
+        | None -> None
+        | Some a -> f a
 
+    member this.ReturnFrom (x) = x
+
+    member this.TryFinally (body, compensation) =
+        try this.ReturnFrom(body())
+        finally compensation()
+
+    member this.Using (disposable: 'a when 'a :> IDisposable, body) =
+        let body' = fun () -> body disposable
+        this.TryFinally(body', fun () ->
+            match disposable with
+            | null -> ()
+            | disp -> disp.Dispose())
+
+    member this.Zero () =
+        None
+
+    member this.Return (x) =
+        Some x
+
+let maybe = new MaybeBuilder()
\ No newline at end of file