member this.toBool = UBool.UTrue this
interface IBool<True> with
member this.toBoolG = this
member this.toTrue = this
member this.toBool = UBool.UFalse this
interface IBool<False> with
member this.toBoolG = this
member this.toFalse = this
and IBool = abstract member toBool: UBool
and IBool<'T when 'T :> IBool> =
abstract member toBoolG: 'T
abstract member toTrue: True
abstract member toFalse: False
static member toTrue (_:#ITrue) = True
static member toFalse (_: #IFalse) = False
static member toBool (_:True) = UBool.UTrue True
static member toBool(_:False) = UBool.UFalse False
static member inline Not (_:True) = False
static member inline Not (_:False) = True
member this.toBool = this
interface IBool<UBool> with
[<RequireQualifiedAccess>]
member this.toFlag = this
abstract member toFlag: Flag<'F>
[<RequireQualifiedAccess>]
type FlagB<'F, 'B when 'B :> IBool> =
let Flag (f, b) = this in FlagB.Flag (f, b)
interface IFlag<'F,'B> with
member this.toFlag = this
and IFlag<'F, 'B when 'B :> IBool> =
abstract member toFlag: FlagB<'F,'B>
type TrueFlag<'F> = FlagB<'F, True>
type FalseFlag<'F> = FlagB<'F, False>
| And of Flag<'F1>*Flag<'F2>
type And<'F1,'F2,'B1,'B2 when 'B1 :> IBool and 'B2 :> IBool> =
| And of FlagB<'F1,'B1> * FlagB<'F2,'B2>