2019-07-03 15:04:25 +03:00
|
|
|
module Data.So
|
|
|
|
|
|
|
|
||| Ensure that some run-time Boolean test has been performed.
|
|
|
|
|||
|
|
|
|
||| This lifts a Boolean predicate to the type level. See the function `choose`
|
|
|
|
||| if you need to perform a Boolean test and convince the type checker of this
|
|
|
|
||| fact.
|
|
|
|
|||
|
|
|
|
||| If you find yourself using `So` for something other than primitive types,
|
|
|
|
||| it may be appropriate to define a type of evidence for the property that you
|
|
|
|
||| care about instead.
|
|
|
|
public export
|
2019-10-26 00:24:25 +03:00
|
|
|
data So : Bool -> Type where
|
2019-07-03 15:04:25 +03:00
|
|
|
Oh : So True
|
|
|
|
|
|
|
|
export
|
|
|
|
implementation Uninhabited (So False) where
|
|
|
|
uninhabited Oh impossible
|
|
|
|
|
|
|
|
||| Perform a case analysis on a Boolean, providing clients with a `So` proof
|
|
|
|
export
|
|
|
|
choose : (b : Bool) -> Either (So b) (So (not b))
|
|
|
|
choose True = Left Oh
|
|
|
|
choose False = Right Oh
|
|
|
|
|