{-# OPTIONS --type-in-type #-}

module Chapter3.EnumU.Pi where

open import Function

open import Data.Unit
open import Data.Product
open import Data.Nat
open import Data.Fin

open import Chapter1.Logic

open import Chapter2.Desc
open import Chapter2.Desc.Fixpoint
open import Chapter2.Desc.Lifting
open import Chapter2.Desc.Induction

open import Chapter3.EnumU

private 
  record ⟨π_$_⟩ (E : EnumU)(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 α : [ EnumUD ]^  E  (P : EnumT E  Set)  ⟨π E $ P ) 
               E  (P : EnumT  E   Set)   ⟨π  E  $ P )
          α {zero , tt} tt = λ P  return 
          α {suc zero , (a , e , tt)} (ih , tt) = λ P  return (P ze × call (ih (P  su)))
          α {suc (suc ()) , _} _

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