packages feed

sq-0.0.1: lib/Sq/Mode.hs

module Sq.Mode
   ( -- * Mode
    Mode (..)
   , SMode (..)
   , fromSMode

    -- * Constraints
   , SubMode
   ) where

import Di.Df1 qualified as Di
import GHC.TypeLits qualified as GHC
import Prelude hiding (Read)

--------------------------------------------------------------------------------

data Mode
   = -- | * A @'Sq.Statement' \''Read'@ performs a read-only query.
     -- Obtain with 'Sq.readStatement'.
     --
     -- * A @'Sq.Transaction' \''Read'@ can permorm \''Read'
     -- 'Sq.Statement's only. Obtain with 'Sq.readTransaction'.
     --
     -- * A @'Sq.Pool' \''Read'@ can permorm \''Read' 'Sq.Transaction's only.
     -- Obtain with 'Sq.readPool' or 'Sq.subPool'.
     Read
   | -- | * A @'Sq.Statement' \''Write'@ performs a read or write query.
     -- Obtain with 'Sq.writeStatement'.
     --
     -- * A @'Sq.Transaction' \''Write'@ can permorm both \''Read' and
     -- \''Write' 'Sq.Statement's. Obtain with 'Sq.commitTransaction' or
     -- 'Sq.rollbackTransaction'.
     --
     -- * A @'Sq.Pool' \''Write'@ can permorm both \''Read' and \''Write'
     -- 'Sq.Transaction's. Obtain with 'Sq.writePool' or 'Sq.tempPool'.
     Write
   deriving stock (Eq, Ord, Show)

data SMode (mode :: Mode) where
   SRead :: SMode 'Read
   SWrite :: SMode 'Write

fromSMode :: SMode mode -> Mode
fromSMode = \case
   SRead -> Read
   SWrite -> Write
{-# INLINE fromSMode #-}

instance Di.ToValue Mode where
   value = \case
      Read -> "read"
      Write -> "write"
   {-# INLINE value #-}

instance Di.ToValue (SMode mode) where
   value = Di.value . fromSMode
   {-# INLINE value #-}

--------------------------------------------------------------------------------

class SubMode (sup :: Mode) (sub :: Mode)
instance SubMode Read Read
instance SubMode Write Read
instance SubMode Write Write
instance
   (GHC.TypeError (GHC.Text "Write mode is not a subset of Read mode"))
   => SubMode Read Write