module Chapter8.EnumU.Pi where

open import Level 
  renaming ( zero to zeroL
           ; suc to sucL )
open import Function

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

open import Chapter2.Logic

open import Chapter5.Desc
open import Chapter5.Desc.Fixpoint
open import Chapter5.Desc.Lifting
open import Chapter5.Desc.Induction

open import Chapter8.EnumU

private 
  record ⟨π_$_⟩ (E : EnumU {sucL zeroL})(P : EnumT E  Set) : Set₁ where
    constructor return
    field 
      call : Set 
  open ⟨π_$_⟩ public

  πh : (E : EnumU)(P : EnumT E  Set)  ⟨π E $ P 
  πh = induction EnumUD  E  (P : EnumT E  Set)  ⟨π E $ P )  {xs}  α {xs})
    where α : {E :  EnumUD  EnumU} 
              [_]^ {k = zeroL} (EnumUD {sucL zeroL})  E  (P : EnumT E  Set)  ⟨π E $ P ) E 
              (P : EnumT  E   Set)   ⟨π  E  $ P 
          α {lift zero , lift tt} (lift tt) = λ P  return 
          α {lift (suc zero) , (a , e , lift tt)} (ih , lift tt) = λ P  return (P ze × call (ih (P  su)))
          α {lift (suc (suc ())) , _} _

π : (E : EnumU)(P : EnumT E  Set)  Set
π E P = call (πh E P)