Add a DPI calculator to help to find the correct image resolution.
[master-thesis.git] / Parasitemia / ParasitemiaCore / Types.fs
index 917e7d8..5440115 100644 (file)
@@ -35,7 +35,7 @@ type Ellipse (cx: float32, cy: float32, a: float32, b: float32, alpha: float32)
         this.CutAVericalLine 0.f || this.CutAVericalLine width ||
         this.CutAnHorizontalLine 0.f || this.CutAnHorizontalLine height
 
-    member this.Scale (factor: float32) =
+    member this.Scale (factor: float32) : Ellipse =
         Ellipse(this.Cx, this.Cy, this.A * factor, this.B * factor, alpha)
 
     // Approximation of Ramanujan.
@@ -50,8 +50,8 @@ type CellClass = HealthyRBC | InfectedRBC | Peculiar
 type Cell = {
     cellClass: CellClass
     center: Point
-    infectedArea: int
-    stainArea: int
+    nucleusArea: int
+    parasiteArea: int
     elements: Matrix<byte> }
 
 [<Struct>]
@@ -59,4 +59,45 @@ 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 = MaybeBuilder()
+
+type Result<'a> =
+    | Success of 'a
+    | Fail of string // Error message.
+
+type ResultBuilder () =
+    member this.Bind (res, f) =
+        match res with
+        | Success value -> f value
+        | fail -> fail
+
+    member this.ReturnFrom (x) = x
+
+let result = ResultBuilder()
\ No newline at end of file