{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeOperators #-}
module Grisette.Internal.SymPrim.SymPrim (Prim, SymPrim, BasicSymPrim) where
import Control.DeepSeq (NFData)
import Data.Binary (Binary)
import Data.Bytes.Serial (Serial)
import Data.Hashable (Hashable)
import Data.Serialize (Serialize)
import Grisette.Internal.Core.Data.Class.EvalSym (EvalSym)
import Grisette.Internal.Core.Data.Class.ExtractSym (ExtractSym)
import Grisette.Internal.Core.Data.Class.Function (Apply (FunType))
import Grisette.Internal.Core.Data.Class.GenSym (GenSymSimple)
import Grisette.Internal.Core.Data.Class.ITEOp (ITEOp)
import Grisette.Internal.Core.Data.Class.Mergeable (Mergeable)
import Grisette.Internal.Core.Data.Class.SimpleMergeable (SimpleMergeable)
import Grisette.Internal.Core.Data.Class.Solvable (Solvable)
import Grisette.Internal.Core.Data.Class.SubstSym (SubstSym)
import Grisette.Internal.Core.Data.Class.ToCon (ToCon)
import Grisette.Internal.Core.Data.Class.ToSym (ToSym)
import Grisette.Internal.Internal.Decl.Core.Data.Class.PPrint (PPrint)
import Grisette.Internal.Internal.Decl.Core.Data.Class.SymEq (SymEq)
import Grisette.Internal.Internal.Decl.Core.Data.Class.SymOrd (SymOrd)
import Grisette.Internal.SymPrim.AllSyms (AllSyms)
import Grisette.Internal.SymPrim.Prim.Internal.Term
( ConRep (ConType),
LinkedRep,
SupportedNonFuncPrim,
)
import Language.Haskell.TH.Syntax (Lift)
import Type.Reflection (Typeable)
type Prim a =
( Show a,
Binary a,
Serial a,
Serialize a,
NFData a,
Eq a,
EvalSym a,
ExtractSym a,
Mergeable a,
PPrint a,
SubstSym a,
SymEq a,
SymOrd a,
AllSyms a,
Hashable a,
Lift a,
Typeable a
)
type SymPrim a =
( Prim a,
ITEOp a,
GenSymSimple a a
)
type BasicSymPrim a =
( SymPrim a,
SimpleMergeable a,
GenSymSimple () a,
Solvable (ConType a) a,
ConRep a,
LinkedRep (ConType a) a,
ToCon a (ConType a),
ToSym (ConType a) a,
Apply a,
a ~ FunType a,
SupportedNonFuncPrim (ConType a)
)