{-# 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)