------------------------------------------------------------------------
-- Modality variants
------------------------------------------------------------------------

open import Tools.Level

module Graded.Modality.Variant (a : Level) where

open import Tools.Bool
open import Tools.Empty
open import Tools.Level
open import Tools.PropositionalEquality
open import Tools.Relation
open import Tools.Unit

-- Modality variants:
-- * Modalities can come with one mode (๐Ÿ™แต) or two (๐Ÿ™แต and ๐Ÿ˜แต).
-- * They can also come with, or not come with, a dedicated
--   natrec-star operator _โŠ›_โ–ท_. Even if they don't come with a
--   *dedicated* natrec-star operator one or more such operators can
--   perhaps still be defined.

record Modality-variant : Set (lsuc a) where
  field
    -- Is the mode ๐Ÿ˜แต allowed?
    ๐Ÿ˜แต-allowed : Bool

    -- Is a dedicated natrec-star operator available?
    โŠ›-available : Set a

    -- The type โŠ›-available is a proposition.
    โŠ›-available-propositional : (p q : โŠ›-available) โ†’ p โ‰ก q

    -- The type โŠ›-available is decided.
    โŠ›-available-decided : Dec โŠ›-available

-- A variant for which a dedicated natrec-star operator must be
-- available, and ๐Ÿ˜แต is available if the boolean is true.

โŠ›-available-and-๐Ÿ˜แต-available-if : Bool โ†’ Modality-variant
โŠ›-available-and-๐Ÿ˜แต-available-if ok = record
  { ๐Ÿ˜แต-allowed                = ok
  ; โŠ›-available               = Lift _ โŠค
  ; โŠ›-available-propositional = ฮป _ _ โ†’ refl
  ; โŠ›-available-decided       = yes _
  }

-- A variant for which a dedicated natrec-star operator is not
-- available, and ๐Ÿ˜แต is available if the boolean is true.

โŠ›-not-available-and-๐Ÿ˜แต-available-if : Bool โ†’ Modality-variant
โŠ›-not-available-and-๐Ÿ˜แต-available-if ok = record
  { ๐Ÿ˜แต-allowed                = ok
  ; โŠ›-available               = Lift _ โŠฅ
  ; โŠ›-available-propositional = ฮป ()
  ; โŠ›-available-decided       = no (ฮป ())
  }