open import Level

open import Data.Unit
open import Data.Product
open import Data.Sum

open import Chapter2.Logic

open import Chapter4.Desc
open import Chapter4.Desc.Fixpoint


module Chapter4.Desc.Lifting
          { k : Level}
          {X : Set } where


[_]^ : (D : Desc )(P : X  Set (  k)) (xs :  D  X)  Set (  k)
[ `1 ]^ P (lift tt) = Lift 
[ `var ]^ P xs = P xs
[ T  T' ]^ P (t , t') =  [ T ]^ P t × [ T' ]^ P t'
[ T `+ T' ]^ P (inj₁ t) =  [ T ]^ P t
[ T `+ T' ]^ P (inj₂ t') =  [ T' ]^ P t'
[  S T ]^ P (s , xs) = [ T s ]^ P xs
[  S T ]^ P f = (s : S)  [ T s ]^ P (f s) 

[_]^map : (D : Desc ){P : X  Set (  k)}(p : (x : X)  P x)
          (xs :  D  X)  [ D ]^ P xs
[ `1 ]^map p (lift tt) = lift tt
[ `var ]^map p xs = p xs
[ T  T' ]^map p (t , t')= [ T ]^map p t , [ T' ]^map p t'
[ T `+ T' ]^map p (inj₁ t) = [ T ]^map p t
[ T `+ T' ]^map p (inj₂ t') =  [ T' ]^map p t'
[  S T ]^map p (s , xs) = [ T s ]^map p xs
[  S T ]^map p f = λ s  [ T s ]^map p (f s)