{-# OPTIONS --safe #-}

module Data.Bool.Properties where

open import Data.Bool
open import Decidable
open import Path
open import Data.Unit
open import HLevels
open import Data.Empty.Properties
open import Data.Unit.Properties

discreteBool : Discrete Bool
discreteBool = from-bool-eq
  record { _≡ᴮ_ = bool′ !  x  x)
         ; sound = λ { false false p  refl ; true true p  refl }
         ; complete = λ { false  tt ; true  tt }
         }

isSetBool : isSet Bool
isSetBool = Discrete→isSet discreteBool

isPropT :  b  isProp (T b)
isPropT false = isProp⊥
isPropT true  = isProp⊤

open import Data.Empty

false≢true : false  true
false≢true p = subst (bool  ) p tt

true≢false : true  false
true≢false p = subst (bool  ) p tt

open import Level
open import Isomorphism
open import Data.Sigma

Bool→⇔× : (Bool  A)  (A × A)
Bool→⇔× .fun f = f false , f true
Bool→⇔× .inv (x , y) false  = x
Bool→⇔× .inv (x , y) true   = y
Bool→⇔× .rightInv _ = refl
Bool→⇔× .leftInv f i false = f false
Bool→⇔× .leftInv f i true  = f true

||-assoc : (x y z : Bool)  (x || y) || z  x || (y || z)
||-assoc false y z = refl
||-assoc true  y z = refl

||-idʳ :  x  x || false  x
||-idʳ false = refl
||-idʳ true  = refl

||-annʳ :  x  x || true  true
||-annʳ false = refl
||-annʳ true  = refl

||-comm : (x y : Bool)  x || y  y || x
||-comm false y = sym (||-idʳ y)
||-comm true  y = sym (||-annʳ y)

||-idem :  x  x || x  x
||-idem false  = refl
||-idem true   = refl

&&-assoc : (x y z : Bool)  (x && y) && z  x && (y && z)
&&-assoc false y z = refl
&&-assoc true  y z = refl

&&-idʳ :  x  x && true  x
&&-idʳ false = refl
&&-idʳ true  = refl

&&-annʳ :  x  x && false  false
&&-annʳ false = refl
&&-annʳ true  = refl

&&-comm : (x y : Bool)  x && y  y && x
&&-comm false y = sym (&&-annʳ y)
&&-comm true  y = sym (&&-idʳ  y)

&&-idem :  x  x && x  x
&&-idem false = refl
&&-idem true = refl