packages feed

grisette-0.10.0.0: src/Grisette/Unified/Internal/EvalModeTag.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveLift #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TypeFamilyDependencies #-}

-- |
-- Module      :   Grisette.Unified.Internal.EvalModeTag
-- Copyright   :   (c) Sirui Lu 2024
-- License     :   BSD-3-Clause (see the LICENSE file)
--
-- Maintainer  :   siruilu@cs.washington.edu
-- Stability   :   Experimental
-- Portability :   GHC only
module Grisette.Unified.Internal.EvalModeTag
  ( EvalModeTag (..),
    IsConMode,
  )
where

import Language.Haskell.TH.Syntax (Lift)

-- | Evaluation mode for unified types. 'C' means concrete evaluation, 'S'
-- means symbolic evaluation.
data EvalModeTag = C | S deriving (Lift)

-- | Type family to check if a mode is 'C'.
type family IsConMode (mode :: EvalModeTag) = (r :: Bool) | r -> mode where
  IsConMode 'C = 'True
  IsConMode 'S = 'False