module Implicit.Language.Counter2Mask where

open import Implicit.Language.Base

data Counter : Set where
  Z : Counter
  ∞ : Counter
  π•š : Counter β†’ Counter
  𝕔 : Counter β†’ Counter


c2m : Counter β†’ Mask
c2m Z = ` β– 
c2m ∞ = ` β–‘
c2m (π•š j) = β–‘ Β· c2m j
c2m (𝕔 j) = β–  Β· c2m j

m2c : Mask β†’ Counter
m2c (` β–‘) = ∞
m2c (` β– ) = Z
m2c (β–‘ Β· m) = π•š (m2c m)
m2c (β–  Β· m) = 𝕔 (m2c m)


iso1 : βˆ€ j
  β†’ c2m (m2c j) ≑ j
iso1 (` β–‘) = refl
iso1 (` β– ) = refl
iso1 (β–‘ Β· j) = congβ‚‚ _Β·_ refl (iso1 j)
iso1 (β–  Β· j) = congβ‚‚ _Β·_ refl (iso1 j)

iso2 : βˆ€ j
  β†’ m2c (c2m j) ≑ j
iso2 Z = refl
iso2 ∞ = refl
iso2 (π•š j) = cong π•š (iso2 j)
iso2 (𝕔 j) = cong 𝕔 (iso2 j)