{-# OPTIONS --type-in-type #-} module Chapter3.IDesc.FreeMonad.Examples.IDesc where open import Data.Unit open import Data.Nat hiding (_*_) open import Data.Fin open import Data.Vec hiding (_>>=_) open import Data.Product open import Data.String open import Chapter1.Logic open import Chapter2.IDesc open import Chapter2.IDesc.Tagged open import Chapter2.IDesc.Fixpoint open import Chapter3.IDesc.FreeMonad open import Chapter3.IDesc.FreeMonad.IMonad open import Chapter3.IDesc.FreeMonad.Monad IDescD : tagDesc ⊤ IDescD = (5 , (λ _ → `1 ∷ `var tt `× `var tt `× `1 ∷ (`Σ ℕ λ n → (`Π (Fin n) λ _ → `var tt) `× `1) ∷ (`Σ Set λ S → (`Π S λ _ → `var tt) `× `1) ∷ (`Σ Set λ S → (`Π S λ _ → `var tt) `× `1) ∷ [])) , (λ _ → 0) , λ _ → [] IDesc' : Set → Set₁ IDesc' I = (IDescD * (λ _ → I)) tt record func' (I J : Set) : Set₁ where constructor mk field out : J → IDesc' I `var' : ∀{I} → I → IDesc' I `var' i = `v {D = IDescD} i `1' : ∀{I} → IDesc' I `1' = ⟨ suc zero , tt ⟩ _`×'_ : ∀{I} (A B : IDesc' I) → IDesc' I A `×' B = ⟨ suc (suc zero) , A , B , tt ⟩ `σ' : ∀{I} (n : ℕ)(T : Fin n → IDesc' I) → IDesc' I `σ' n T = ⟨ suc (suc (suc zero)) , n , T , tt ⟩ `Σ' : ∀{I} (S : Set)(T : S → IDesc' I) → IDesc' I `Σ' S T = ⟨ suc (suc (suc (suc zero))) , S , T , tt ⟩ `Π' : ∀{I} (S : Set)(T : S → IDesc' I) → IDesc' I `Π' S T = ⟨ suc (suc (suc (suc (suc zero)))) , S , T , tt ⟩ _∘_ : ∀{I J K} → func' J K → func' I J → func' I K D ∘ E = func'.mk (λ k → func'.out D k >>= func'.out E) where open RawIMonad (monad IDescD)