module Chapter6.IDesc.Examples.Walk where

open import Level 
  hiding (suc)
  renaming (zero to zeroL)

open import Data.Unit
open import Data.Nat
open import Data.Fin hiding (lift)
open import Data.Vec 
open import Data.Product

open import Relation.Binary.PropositionalEquality

open import Chapter6.IDesc
open import Chapter6.IDesc.Fixpoint
open import Chapter6.IDesc.Tagged


WalkD : tagDesc zeroL 
WalkD = (1 ,  n  `var (suc n)  `1  [])) ,
        ((λ { zero  1 
            ; (suc n)  1 }) , 
          λ { zero  `1  [] 
            ; (suc n)  `var n  `1  [] })

Walk :   Set
Walk = μ (toDesc WalkD)

up : ∀{n}  Walk (suc n)  Walk n
up w =  lift zero , w , lift tt 

stop : Walk 0
stop =  lift (suc zero) , lift tt 

down : ∀{n}  Walk n  Walk (suc n)
down w =  lift (suc zero) , w , lift tt