{-# OPTIONS --without-K #-}
open import Type
open import Function.NP
open import Level.NP
module Data.ShapePolymorphism where
data ☐ {a}(A : ★_ a) : ★_ a where
[_] : ..(x : A) → ☐ A
un☐ : ∀ {a b}{A : ★_ a}{B : ☐ A → ★_ b} → (..(x : A) → B [ x ]) → Π (☐ A) B
un☐ f [ x ] = f x
Π☐ : ∀ {a b}(A : ★_ a) → (B : ☐ A → ★_ b) → ★_ (a ⊔ b)
Π☐ A B = (x : ☐ A) → B x
_>>☐_ : ∀ {a b}{A : ★_ a}{B : ☐ A → ★_ b} (x : ☐ A) → (..(x : A) → B [ x ]) → B x
[ x ] >>☐ f = f x
map☐ : ∀ {a b}{A : ★_ a}{B : ★_ b} → (..(x : A) → B) → ☐ A → ☐ B
map☐ f [ x ] = [ f x ]
data _≡☐_ {a} {A : ★_ a} (x : A) : ..(y : A) → ★_ a where
refl : x ≡☐ x
record S⟨_⟩ {a} {A : ★_ a} ..(x : A) : ★_ a where
constructor S[_∥_]
field
unS : A
isS : unS ≡☐ x
open S⟨_⟩ public
pattern S[_] x = S[ x ∥ refl ]