{-# LANGUAGE GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PatternSynonyms #-}
module Grisette.Internal.SymPrim.ModelRep (ModelSymPair (..)) where
import Grisette.Internal.Core.Data.Class.ModelOps
( ModelOps (emptyModel, insertValue),
ModelRep (buildModel),
)
import Grisette.Internal.SymPrim.Prim.Model (Model)
import Grisette.Internal.SymPrim.Prim.Term
( LinkedRep (underlyingTerm),
pattern SymTerm,
)
data ModelSymPair ct st where
(:=) :: (LinkedRep ct st) => st -> ct -> ModelSymPair ct st
instance ModelRep (ModelSymPair ct st) Model where
buildModel :: ModelSymPair ct st -> Model
buildModel (st
sym := ct
val) =
case st -> Term ct
forall con sym. LinkedRep con sym => sym -> Term con
underlyingTerm st
sym of
SymTerm TypedSymbol 'AnyKind ct
symbol -> TypedSymbol 'AnyKind ct -> ct -> Model -> Model
forall t. TypedSymbol 'AnyKind t -> t -> Model -> Model
forall model symbolSet (typedSymbol :: * -> *) t.
ModelOps model symbolSet typedSymbol =>
typedSymbol t -> t -> model -> model
insertValue TypedSymbol 'AnyKind ct
symbol ct
val Model
forall model symbolSet (typedSymbol :: * -> *).
ModelOps model symbolSet typedSymbol =>
model
emptyModel
Term ct
_ -> [Char] -> Model
forall a. HasCallStack => [Char] -> a
error [Char]
"buildModel: should only use symbolic constants"