{-# OPTIONS --safe #-}

module Cubical.Algebra.BooleanRing.Initial where

open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Structure
open import Cubical.Foundations.Function

open import Cubical.Algebra.BooleanRing.Base
open import Cubical.Data.Bool renaming (elim to bool-ind)
open import Cubical.Algebra.CommRing
open import Cubical.Tactics.CommRingSolver

open import Cubical.Algebra.BooleanRing.Instances.Bool
open import Cubical.Algebra.CommRing.Instances.Bool

module _ { : Level} (B : BooleanRing ) where
  private
    B' = BooleanRing→CommRing B

  open CommRingStr (snd B')
  open BooleanAlgebraStr B
  open IsCommRingHom

  BoolBR→BAMap : Bool   B 
  BoolBR→BAMap = bool-ind 1r 0r

  BoolBR→BAIsCommRingHom : IsCommRingHom (snd BoolCR) BoolBR→BAMap (snd B')
  pres0 BoolBR→BAIsCommRingHom = refl
  pres1 BoolBR→BAIsCommRingHom = refl
  pres+ BoolBR→BAIsCommRingHom =
    λ { false false  solve! B'
    ; false true   solve! B'
    ; true  false  solve! B'
    ; true  true   sym characteristic2
    }
  pres· BoolBR→BAIsCommRingHom =
    λ { false false  solve! B'
    ; false true   solve! B'
    ; true  false  solve! B'
    ; true  true   solve! B'
    }
  pres- BoolBR→BAIsCommRingHom false = solve! B'
  pres- BoolBR→BAIsCommRingHom true  = -IsId :> 1r  - 1r

  BoolBR→ : BoolHom BoolBR B
  BoolBR→ = BoolBR→BAMap , BoolBR→BAIsCommRingHom

  BoolBR→IsUnique : (f : BoolHom BoolBR B)  (fst f)  fst (BoolBR→)
  BoolBR→IsUnique f =  funExt (bool-ind (pres1 (snd f)) (pres0 (snd f)))