{-# OPTIONS --cubical --safe #-}

module Data.Binary.FromZeroed where

open import Data.Binary.Definition
open import Prelude

inc-z : 𝔹  𝔹
inc-z 0ᵇ = 2ᵇ 0ᵇ
inc-z (1ᵇ xs) = 2ᵇ xs
inc-z (2ᵇ xs) = 1ᵇ inc-z xs

toZ : 𝔹  𝔹
toZ 0ᵇ = 0ᵇ
toZ (1ᵇ xs) = 2ᵇ toZ xs
toZ (2ᵇ xs) = 1ᵇ inc-z (toZ xs)

ones :   𝔹  𝔹
ones zero    xs = xs
ones (suc n) xs = 1ᵇ ones n xs

fromZ₁ :   𝔹  𝔹
fromZ₁ n 0ᵇ      = 0ᵇ
fromZ₁ n (1ᵇ xs) = fromZ₁ (suc n) xs
fromZ₁ n (2ᵇ xs) = 2ᵇ ones n (fromZ₁ 0 xs)

fromZ : 𝔹  𝔹
fromZ 0ᵇ = 0ᵇ
fromZ (1ᵇ xs) = fromZ₁ zero xs
fromZ (2ᵇ xs) = 1ᵇ fromZ xs

import Data.Binary.Conversion.Fast as Fast

open import Data.List using (List; _⋯_; map)

round-trip :   Type
round-trip n = map (fromZ  toZ) nums  nums
  where
  nums : List 𝔹
  nums = map Fast.⟦_⇑⟧ (0  n)

_ : round-trip 300
_ = refl