{-

Axioms requiring that each shape is tiny, in the sense that exponentiation by each shape
has an external right adjoint.

The fact that this right adjoint is external is captured by its being a flat-modal
function from the universe of types. In the motivating semantics in cartesian cubical
sets, this means it takes a closed presheaf as an argument rather than a family of
presheaves over a context. (More precisely, it takes a family of presheaves over a *set*
as opposed to over an arbitrary *presheaf*.)

We encode the adjunction as a natural isomorphism on hom-sets.

-}
module axiom.tiny where

open import basic
open import axiom.shape

infixr 4 _√_

--↓ The right adjoint to exponentiation by S, written S √ (–)

postulate
  _√_ :  {@} (@S : Shape) (@A : Type )  Type 

module √Axioms (@S : Shape) where

  module _ {@ ℓ'} {@A : Type } {@B : Type ℓ'} where

    postulate
      --↓ Transposition from left to right.

      transposeRight : @(A ^ S  B)  (A  S  B)

      --↓ Transposition from right to left.

      transposeLeft : @(A  S  B)  (A ^ S  B)

      --↓ Right and left transposition are mutually inverse.

      transposeLeftRight : (@f : A ^ S  B)  transposeLeft (transposeRight f)  f
      transposeRightLeft : (@g : A  S  B)  transposeRight (transposeLeft g)  g

    {-# REWRITE transposeLeftRight transposeRightLeft #-}

  postulate
    --↓ Naturality of left-to-right transposition in the domain.

    transposeRight^ :  {@ ℓ' ℓ''}
      {@A : Type } {@A' : Type ℓ'} {@B : Type ℓ''}
      (@h : A  A') (@f : A' ^ S  B)
       transposeRight (f  (h `^ S))  transposeRight f  h