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

open import Chapter1.Logic

open import Chapter2.Desc
open import Chapter2.Desc.Fixpoint


module Chapter2.Desc.Lifting
          {X : Set} where


[_]^ : (D : Desc)(P : X  Set) (xs :  D  X)  Set
[ `1 ]^ P tt = 
[ `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}(p : (x : X)  P x)
          (xs :  D  X)  [ D ]^ P xs
[ `1 ]^map p tt = 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)