{-# OPTIONS --cumulativity #-}
module ROmega.Types.Syntax where

open import Agda.Primitive
open import Level

open import Data.String

--------------------------------------------------------------------------------
-- infix OOP.

infixr 9 _`→_
infixr 9 _⇒_
infixr 10 _▹_
infixr 10 _R▹_
infixr 10 _≲_
infix 10 _·_~_
infixl 11 _·[_]

--------------------------------------------------------------------------------
-- Labels are Strings.

Label : Set
Label = String

--------------------------------------------------------------------------------
-- Kinds.

data Kind : Level  Set where
   : ( : Level)  Kind 
  _`→_ :  {ℓ₁ ℓ₂}  Kind ℓ₁  Kind ℓ₂  Kind (ℓ₁  ℓ₂)
  L :  {}  Kind 
  R[_] :  {}  Kind   Kind 

-- type synonyms
lone ltwo lthree : Level
lone   = lsuc lzero
ltwo   = lsuc lone
lthree = lsuc ltwo

★₀ =  lzero
★₁ =  lone
★₂ =  ltwo

--------------------------------------------------------------------------------
-- Kinding Environments, types, and predicates.
--
-- Kinding Environments, types, and predicates are tied up together, like so:
--   - Pred references Ty, KEnv
--   - Ty   references KEnv
--   - KEnv references Pred

data KEnv : Level  Set
data Ty : { ι : Level}  KEnv   Kind ι   Set
data Pred { ι : Level} (Δ : KEnv ) (κ : Kind ι) : Set

data Pred Δ κ where
  _≲_ : (ρ₁ : Ty Δ R[ κ ]) 
        (ρ₂ : Ty Δ R[ κ ]) 
        Pred Δ κ

  _·_~_ : (ρ₁ : Ty Δ R[ κ ]) 
          (ρ₂ : Ty Δ R[ κ ]) 
          (ρ₃ : Ty Δ R[ κ ]) 
          Pred Δ κ

data KEnv where
  ε    : KEnv lzero
  _,_  :  { ι}  KEnv   Kind ι  KEnv (  ι)

--------------------------------------------------------------------------------
-- Type vars.
data TVar :  { ι}  KEnv   Kind ι  Set where
  Z :  {ℓ₁ ℓ₂} {Δ : KEnv ℓ₁} {κ : Kind ℓ₂}
       TVar (Δ , κ) κ
  S :  {ℓ₁ ℓ₂ ℓ₃} {Δ : KEnv ℓ₁} {κ : Kind ℓ₂} {κ' : Kind ℓ₃}
       TVar Δ κ  TVar (Δ , κ') κ

--------------------------------------------------------------------------------
-- Types.

data Ty where
  ------------------------------------------------------------
  -- Base types (for mechanization).

  -- Unit (Mechanization.)
  U :  { : Level} {Δ : KEnv } 

         --------------
         Ty Δ ★₀
  ------------------------------------------------------------
  -- System Fω.

  tvar :  {ℓ₁ ℓ₂ : Level} {Δ : KEnv ℓ₁} {κ : Kind ℓ₂} 

         TVar Δ κ 
         -----------
         Ty Δ κ

  _`→_ :  {ℓ₁ ℓ₂ ℓ₃ : Level} {Δ : KEnv ℓ₁} 
          Ty Δ ( ℓ₂)  Ty Δ ( ℓ₃) 
          -----------------------------------
          Ty Δ ( (ℓ₂  ℓ₃))

  `∀ :   {ℓ₁ ℓ₂ ℓ₃ : Level} {Δ : KEnv ℓ₁} 
          (κ : Kind ℓ₃)  Ty (Δ , κ) ( ℓ₂) 
          -------------------------------------
          Ty Δ ( (ℓ₂  (lsuc ℓ₃)))

   :   {ℓ₁ ℓ₂ ℓ₃ : Level} {Δ : KEnv ℓ₁} (κ₁ : Kind ℓ₂) {κ₂ : Kind ℓ₃} 
          Ty (Δ , κ₁) κ₂ 
          -----------------------------------------
          Ty Δ (κ₁ `→ κ₂)

  _·[_] :  {ℓ₁ ℓ₂ ℓ₃ : Level} {Δ : KEnv ℓ₁} {κ₁ : Kind ℓ₂} {κ₂ : Kind ℓ₃} 
          Ty Δ (κ₁ `→ κ₂)  Ty Δ κ₁ 
          -----------------------------
          Ty Δ κ₂
  ------------------------------------------------------------
  -- Qualified types.

  _⇒_ :  { ℓκ ℓτ} {κ : Kind ℓκ} {Δ : KEnv }
           (π : Pred Δ κ)  Ty Δ ( ℓτ) 
         --------------------------------
         Ty Δ ( (lsuc ℓκ  ℓτ))

  ------------------------------------------------------------
  -- System Rω.

  -- Labels.
  lab :   { : Level} {Δ : KEnv } 
         Label 
         ----------
         Ty {}{lzero} Δ L

  -- singleton formation.
  _▹_ :  { ι : Level} {Δ : KEnv } {κ : Kind ι} 
         Ty Δ L  Ty Δ κ 
         -------------------
         Ty Δ κ

  -- Row singleton formation.
  _R▹_ :  { ι : Level} {Δ : KEnv } {κ : Kind ι} 
         Ty Δ L  Ty Δ κ 
         -------------------
         Ty Δ R[ κ ]

  -- label constant formation.
  ⌊_⌋ :  { ι : Level} {Δ : KEnv } 
         Ty Δ L 
         ----------
         Ty Δ ( ι)

  -- The empty record (mechanization only.)
   :  { ι : Level} {Δ : KEnv } 
  
      --------------
      Ty Δ ( ι)

  -- Record formation.
  Π :  { ι : Level} {Δ : KEnv } 
      Ty Δ R[  ι ] 
      -------------
      Ty Δ ( ι)

  -- Variant formation.
  Σ :  { ι : Level} {Δ : KEnv } 
      Ty Δ R[  ι ] 
      -------------
      Ty Δ ( ι)

  -- lift₁ (lifting a function argument to row kind).
  _·⌈_⌉ :  { ι} {Δ : KEnv }
            {κ₁ κ₂ : Kind ι} 
          Ty Δ R[ κ₁ `→ κ₂ ]  Ty Δ κ₁ 
          --------------------------------
          Ty Δ R[ κ₂ ]

  -- lift₂ (lifting a function to row kind.)
  ⌈_⌉·_ :  { ι} {Δ : KEnv }
            {κ₁ κ₂ : Kind ι} 
          Ty Δ (κ₁ `→ κ₂)  Ty Δ R[ κ₁ ] 
          --------------------------------
          Ty Δ R[ κ₂ ]