{-# OPTIONS --cubical #-}

module Data.Binary.Properties.Isomorphism where

open import Data.Binary.Definition
open import Data.Binary.Conversion
open import Data.Binary.Increment
open import Data.Binary.Properties.Helpers
open import Data.Binary.Helpers
import Agda.Builtin.Nat as 

inc-suc :  x   inc x ⇓⟧  suc  x ⇓⟧
inc-suc 0ᵇ     = refl
inc-suc (1ᵇ x) = refl
inc-suc (2ᵇ x) = cong  r  suc (r ℕ.* 2)) (inc-suc x)

inc-2*-1ᵇ :  n  inc  n ℕ.* 2 ⇑⟧  1ᵇ  n ⇑⟧
inc-2*-1ᵇ zero    = refl
inc-2*-1ᵇ (suc n) = cong  r  inc (inc r)) (inc-2*-1ᵇ n)

ℕ→𝔹→ℕ :  x    x ⇑⟧ ⇓⟧  x
ℕ→𝔹→ℕ zero    = refl
ℕ→𝔹→ℕ (suc x) = inc-suc  x ⇑⟧  cong suc (ℕ→𝔹→ℕ x)

𝔹→ℕ→𝔹 :  x    x ⇓⟧ ⇑⟧  x
𝔹→ℕ→𝔹 0ᵇ = refl
𝔹→ℕ→𝔹 (1ᵇ x) =           inc-2*-1ᵇ  x ⇓⟧   cong 1ᵇ_ (𝔹→ℕ→𝔹 x)
𝔹→ℕ→𝔹 (2ᵇ x) = cong inc (inc-2*-1ᵇ  x ⇓⟧)  cong 2ᵇ_ (𝔹→ℕ→𝔹 x)

𝔹⇔ℕ : Iso 𝔹 
𝔹⇔ℕ .fun = ⟦_⇓⟧
𝔹⇔ℕ .inv = ⟦_⇑⟧
𝔹⇔ℕ .rightInv = ℕ→𝔹→ℕ
𝔹⇔ℕ .leftInv  = 𝔹→ℕ→𝔹