module Chapter4.Desc where

open import Level

open import Data.Unit
open import Data.Nat hiding (suc)
open import Data.Fin hiding (suc ; lift)
open import Data.Product
open import Data.Sum

infixr 30 _`×_
infixr 30 _`+_

data Desc ( : Level) : Set (suc ) where
  `var : Desc 
  `1 : Desc 
  _`×_ : (A B : Desc )  Desc 
  _`+_ : (A B : Desc )  Desc 
   : (S : Set )(T : S  Desc )  Desc 
   : (S : Set )(T : S  Desc )  Desc 

⟦_⟧ : ∀{}  Desc   Set   Set 
 `var  X = X
 `1  X = Lift 
 A  B  X =  A  X ×  B  X
 A `+ B  X =  A  X   B  X
  S T  X = Σ[ s  S ]  T s  X
  S T  X = (s : S)   T s  X

⟦_⟧map : ∀{ X Y}   (D : Desc )  (f : X  Y) 
          D  X   D  Y
 `var ⟧map f xs = f xs
 `1 ⟧map f xs = lift tt
 D₁  D₂ ⟧map f (xs₁ , xs₂) =  D₁ ⟧map f xs₁ ,  D₂ ⟧map f xs₂
 D₁ `+ D₂ ⟧map f (inj₁ x) = inj₁ ( D₁ ⟧map f x)
 D₁ `+ D₂ ⟧map f (inj₂ y) = inj₂ ( D₂ ⟧map f y)
  S T ⟧map f (s , xs) = s ,  T s ⟧map f xs
  S T ⟧map f xs = λ s   T s ⟧map f (xs s)