{-# OPTIONS --cubical --no-exact-split --safe #-}
module Cubical.Data.Nat.Base where

open import Agda.Builtin.Nat public
  using (zero; suc; _+_; _*_)
  renaming (Nat to )

predℕ :   
predℕ zero    = 0
predℕ (suc n) = n

caseNat :  {}  {A : Set }  (a0 aS : A)    A
caseNat a0 aS 0       = a0
caseNat a0 aS (suc n) = aS

doubleℕ :   
doubleℕ 0 = 0
doubleℕ (suc x) = suc (suc (doubleℕ x))

-- doublesℕ n m = 2^n * m
doublesℕ :     
doublesℕ 0 m = m
doublesℕ (suc n) m = doublesℕ n (doubleℕ m)

-- iterate
iter :  {} {A : Set }    (A  A)  A  A
iter zero f z    = z
iter (suc n) f z = f (iter n f z)