module Covenant.Internal.Term
( CovenantTypeError (..),
Id (..),
typeId,
Arg (..),
typeArg,
Ref (..),
typeRef,
CompNodeInfo (..),
ValNodeInfo (..),
ASGNode (..),
typeASGNode,
ASGNodeType (..),
)
where
import Control.Monad.Except (MonadError (throwError))
import Control.Monad.HashCons (MonadHashCons (lookupRef))
import Covenant.Constant (AConstant)
import Covenant.DeBruijn (DeBruijn)
import Covenant.Index (Index)
import Covenant.Internal.Rename (RenameError)
import Covenant.Internal.Type (AbstractTy, CompT, ValT)
import Covenant.Internal.Unification (TypeAppError)
import Covenant.Prim (OneArgFunc, ThreeArgFunc, TwoArgFunc)
import Data.Kind (Type)
import Data.Vector (Vector)
import Data.Word (Word64)
data CovenantTypeError
=
BrokenIdReference Id
|
ForceCompType (CompT AbstractTy)
|
ForceNonThunk (ValT AbstractTy)
|
ForceError
|
ThunkValType (ValT AbstractTy)
|
ThunkError
|
ApplyToValType (ValT AbstractTy)
|
ApplyToError
|
ApplyCompType (CompT AbstractTy)
|
RenameFunctionFailed (CompT AbstractTy) RenameError
|
RenameArgumentFailed (ValT AbstractTy) RenameError
|
UnificationError TypeAppError
|
NoSuchArgument DeBruijn (Index "arg")
|
ReturnCompType (CompT AbstractTy)
|
LambdaResultsInValType (ValT AbstractTy)
|
LambdaResultsInNonReturn (CompT AbstractTy)
|
ReturnWrapsError
|
ReturnWrapsCompType (CompT AbstractTy)
|
WrongReturnType (ValT AbstractTy) (ValT AbstractTy)
deriving stock
(
CovenantTypeError -> CovenantTypeError -> Bool
(CovenantTypeError -> CovenantTypeError -> Bool)
-> (CovenantTypeError -> CovenantTypeError -> Bool)
-> Eq CovenantTypeError
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CovenantTypeError -> CovenantTypeError -> Bool
== :: CovenantTypeError -> CovenantTypeError -> Bool
$c/= :: CovenantTypeError -> CovenantTypeError -> Bool
/= :: CovenantTypeError -> CovenantTypeError -> Bool
Eq,
Int -> CovenantTypeError -> ShowS
[CovenantTypeError] -> ShowS
CovenantTypeError -> String
(Int -> CovenantTypeError -> ShowS)
-> (CovenantTypeError -> String)
-> ([CovenantTypeError] -> ShowS)
-> Show CovenantTypeError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CovenantTypeError -> ShowS
showsPrec :: Int -> CovenantTypeError -> ShowS
$cshow :: CovenantTypeError -> String
show :: CovenantTypeError -> String
$cshowList :: [CovenantTypeError] -> ShowS
showList :: [CovenantTypeError] -> ShowS
Show
)
newtype Id = Id Word64
deriving
(
Id -> Id -> Bool
(Id -> Id -> Bool) -> (Id -> Id -> Bool) -> Eq Id
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Id -> Id -> Bool
== :: Id -> Id -> Bool
$c/= :: Id -> Id -> Bool
/= :: Id -> Id -> Bool
Eq,
Eq Id
Eq Id =>
(Id -> Id -> Ordering)
-> (Id -> Id -> Bool)
-> (Id -> Id -> Bool)
-> (Id -> Id -> Bool)
-> (Id -> Id -> Bool)
-> (Id -> Id -> Id)
-> (Id -> Id -> Id)
-> Ord Id
Id -> Id -> Bool
Id -> Id -> Ordering
Id -> Id -> Id
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Id -> Id -> Ordering
compare :: Id -> Id -> Ordering
$c< :: Id -> Id -> Bool
< :: Id -> Id -> Bool
$c<= :: Id -> Id -> Bool
<= :: Id -> Id -> Bool
$c> :: Id -> Id -> Bool
> :: Id -> Id -> Bool
$c>= :: Id -> Id -> Bool
>= :: Id -> Id -> Bool
$cmax :: Id -> Id -> Id
max :: Id -> Id -> Id
$cmin :: Id -> Id -> Id
min :: Id -> Id -> Id
Ord,
Id
Id -> Id -> Bounded Id
forall a. a -> a -> Bounded a
$cminBound :: Id
minBound :: Id
$cmaxBound :: Id
maxBound :: Id
Bounded,
Int -> Id
Id -> Int
Id -> [Id]
Id -> Id
Id -> Id -> [Id]
Id -> Id -> Id -> [Id]
(Id -> Id)
-> (Id -> Id)
-> (Int -> Id)
-> (Id -> Int)
-> (Id -> [Id])
-> (Id -> Id -> [Id])
-> (Id -> Id -> [Id])
-> (Id -> Id -> Id -> [Id])
-> Enum Id
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: Id -> Id
succ :: Id -> Id
$cpred :: Id -> Id
pred :: Id -> Id
$ctoEnum :: Int -> Id
toEnum :: Int -> Id
$cfromEnum :: Id -> Int
fromEnum :: Id -> Int
$cenumFrom :: Id -> [Id]
enumFrom :: Id -> [Id]
$cenumFromThen :: Id -> Id -> [Id]
enumFromThen :: Id -> Id -> [Id]
$cenumFromTo :: Id -> Id -> [Id]
enumFromTo :: Id -> Id -> [Id]
$cenumFromThenTo :: Id -> Id -> Id -> [Id]
enumFromThenTo :: Id -> Id -> Id -> [Id]
Enum
)
via Word64
deriving stock
(
Int -> Id -> ShowS
[Id] -> ShowS
Id -> String
(Int -> Id -> ShowS)
-> (Id -> String) -> ([Id] -> ShowS) -> Show Id
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Id -> ShowS
showsPrec :: Int -> Id -> ShowS
$cshow :: Id -> String
show :: Id -> String
$cshowList :: [Id] -> ShowS
showList :: [Id] -> ShowS
Show
)
typeId ::
forall (m :: Type -> Type).
(MonadHashCons Id ASGNode m, MonadError CovenantTypeError m) =>
Id -> m ASGNodeType
typeId :: forall (m :: Type -> Type).
(MonadHashCons Id ASGNode m, MonadError CovenantTypeError m) =>
Id -> m ASGNodeType
typeId Id
i = do
Maybe ASGNode
lookedUp <- Id -> m (Maybe ASGNode)
forall r e (m :: Type -> Type).
MonadHashCons r e m =>
r -> m (Maybe e)
lookupRef Id
i
case Maybe ASGNode
lookedUp of
Maybe ASGNode
Nothing -> CovenantTypeError -> m ASGNodeType
forall a. CovenantTypeError -> m a
forall e (m :: Type -> Type) a. MonadError e m => e -> m a
throwError (CovenantTypeError -> m ASGNodeType)
-> (Id -> CovenantTypeError) -> Id -> m ASGNodeType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Id -> CovenantTypeError
BrokenIdReference (Id -> m ASGNodeType) -> Id -> m ASGNodeType
forall a b. (a -> b) -> a -> b
$ Id
i
Just ASGNode
node -> ASGNodeType -> m ASGNodeType
forall a. a -> m a
forall (f :: Type -> Type) a. Applicative f => a -> f a
pure (ASGNodeType -> m ASGNodeType)
-> (ASGNode -> ASGNodeType) -> ASGNode -> m ASGNodeType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ASGNode -> ASGNodeType
typeASGNode (ASGNode -> m ASGNodeType) -> ASGNode -> m ASGNodeType
forall a b. (a -> b) -> a -> b
$ ASGNode
node
data Arg = Arg DeBruijn (Index "arg") (ValT AbstractTy)
deriving stock
(
Arg -> Arg -> Bool
(Arg -> Arg -> Bool) -> (Arg -> Arg -> Bool) -> Eq Arg
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Arg -> Arg -> Bool
== :: Arg -> Arg -> Bool
$c/= :: Arg -> Arg -> Bool
/= :: Arg -> Arg -> Bool
Eq,
Eq Arg
Eq Arg =>
(Arg -> Arg -> Ordering)
-> (Arg -> Arg -> Bool)
-> (Arg -> Arg -> Bool)
-> (Arg -> Arg -> Bool)
-> (Arg -> Arg -> Bool)
-> (Arg -> Arg -> Arg)
-> (Arg -> Arg -> Arg)
-> Ord Arg
Arg -> Arg -> Bool
Arg -> Arg -> Ordering
Arg -> Arg -> Arg
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Arg -> Arg -> Ordering
compare :: Arg -> Arg -> Ordering
$c< :: Arg -> Arg -> Bool
< :: Arg -> Arg -> Bool
$c<= :: Arg -> Arg -> Bool
<= :: Arg -> Arg -> Bool
$c> :: Arg -> Arg -> Bool
> :: Arg -> Arg -> Bool
$c>= :: Arg -> Arg -> Bool
>= :: Arg -> Arg -> Bool
$cmax :: Arg -> Arg -> Arg
max :: Arg -> Arg -> Arg
$cmin :: Arg -> Arg -> Arg
min :: Arg -> Arg -> Arg
Ord,
Int -> Arg -> ShowS
[Arg] -> ShowS
Arg -> String
(Int -> Arg -> ShowS)
-> (Arg -> String) -> ([Arg] -> ShowS) -> Show Arg
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Arg -> ShowS
showsPrec :: Int -> Arg -> ShowS
$cshow :: Arg -> String
show :: Arg -> String
$cshowList :: [Arg] -> ShowS
showList :: [Arg] -> ShowS
Show
)
typeArg :: Arg -> ValT AbstractTy
typeArg :: Arg -> ValT AbstractTy
typeArg (Arg DeBruijn
_ Index "arg"
_ ValT AbstractTy
t) = ValT AbstractTy
t
data Ref
=
AnArg Arg
|
AnId Id
deriving stock
(
Ref -> Ref -> Bool
(Ref -> Ref -> Bool) -> (Ref -> Ref -> Bool) -> Eq Ref
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Ref -> Ref -> Bool
== :: Ref -> Ref -> Bool
$c/= :: Ref -> Ref -> Bool
/= :: Ref -> Ref -> Bool
Eq,
Eq Ref
Eq Ref =>
(Ref -> Ref -> Ordering)
-> (Ref -> Ref -> Bool)
-> (Ref -> Ref -> Bool)
-> (Ref -> Ref -> Bool)
-> (Ref -> Ref -> Bool)
-> (Ref -> Ref -> Ref)
-> (Ref -> Ref -> Ref)
-> Ord Ref
Ref -> Ref -> Bool
Ref -> Ref -> Ordering
Ref -> Ref -> Ref
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Ref -> Ref -> Ordering
compare :: Ref -> Ref -> Ordering
$c< :: Ref -> Ref -> Bool
< :: Ref -> Ref -> Bool
$c<= :: Ref -> Ref -> Bool
<= :: Ref -> Ref -> Bool
$c> :: Ref -> Ref -> Bool
> :: Ref -> Ref -> Bool
$c>= :: Ref -> Ref -> Bool
>= :: Ref -> Ref -> Bool
$cmax :: Ref -> Ref -> Ref
max :: Ref -> Ref -> Ref
$cmin :: Ref -> Ref -> Ref
min :: Ref -> Ref -> Ref
Ord,
Int -> Ref -> ShowS
[Ref] -> ShowS
Ref -> String
(Int -> Ref -> ShowS)
-> (Ref -> String) -> ([Ref] -> ShowS) -> Show Ref
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Ref -> ShowS
showsPrec :: Int -> Ref -> ShowS
$cshow :: Ref -> String
show :: Ref -> String
$cshowList :: [Ref] -> ShowS
showList :: [Ref] -> ShowS
Show
)
typeRef ::
forall (m :: Type -> Type).
(MonadHashCons Id ASGNode m, MonadError CovenantTypeError m) =>
Ref -> m ASGNodeType
typeRef :: forall (m :: Type -> Type).
(MonadHashCons Id ASGNode m, MonadError CovenantTypeError m) =>
Ref -> m ASGNodeType
typeRef = \case
AnArg Arg
arg -> ASGNodeType -> m ASGNodeType
forall a. a -> m a
forall (f :: Type -> Type) a. Applicative f => a -> f a
pure (ASGNodeType -> m ASGNodeType)
-> (Arg -> ASGNodeType) -> Arg -> m ASGNodeType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ValT AbstractTy -> ASGNodeType
ValNodeType (ValT AbstractTy -> ASGNodeType)
-> (Arg -> ValT AbstractTy) -> Arg -> ASGNodeType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Arg -> ValT AbstractTy
typeArg (Arg -> m ASGNodeType) -> Arg -> m ASGNodeType
forall a b. (a -> b) -> a -> b
$ Arg
arg
AnId Id
i -> Id -> m ASGNodeType
forall (m :: Type -> Type).
(MonadHashCons Id ASGNode m, MonadError CovenantTypeError m) =>
Id -> m ASGNodeType
typeId Id
i
data CompNodeInfo
= Builtin1Internal OneArgFunc
| Builtin2Internal TwoArgFunc
| Builtin3Internal ThreeArgFunc
| LamInternal Id
| ForceInternal Ref
| ReturnInternal Ref
deriving stock
(
CompNodeInfo -> CompNodeInfo -> Bool
(CompNodeInfo -> CompNodeInfo -> Bool)
-> (CompNodeInfo -> CompNodeInfo -> Bool) -> Eq CompNodeInfo
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CompNodeInfo -> CompNodeInfo -> Bool
== :: CompNodeInfo -> CompNodeInfo -> Bool
$c/= :: CompNodeInfo -> CompNodeInfo -> Bool
/= :: CompNodeInfo -> CompNodeInfo -> Bool
Eq,
Eq CompNodeInfo
Eq CompNodeInfo =>
(CompNodeInfo -> CompNodeInfo -> Ordering)
-> (CompNodeInfo -> CompNodeInfo -> Bool)
-> (CompNodeInfo -> CompNodeInfo -> Bool)
-> (CompNodeInfo -> CompNodeInfo -> Bool)
-> (CompNodeInfo -> CompNodeInfo -> Bool)
-> (CompNodeInfo -> CompNodeInfo -> CompNodeInfo)
-> (CompNodeInfo -> CompNodeInfo -> CompNodeInfo)
-> Ord CompNodeInfo
CompNodeInfo -> CompNodeInfo -> Bool
CompNodeInfo -> CompNodeInfo -> Ordering
CompNodeInfo -> CompNodeInfo -> CompNodeInfo
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: CompNodeInfo -> CompNodeInfo -> Ordering
compare :: CompNodeInfo -> CompNodeInfo -> Ordering
$c< :: CompNodeInfo -> CompNodeInfo -> Bool
< :: CompNodeInfo -> CompNodeInfo -> Bool
$c<= :: CompNodeInfo -> CompNodeInfo -> Bool
<= :: CompNodeInfo -> CompNodeInfo -> Bool
$c> :: CompNodeInfo -> CompNodeInfo -> Bool
> :: CompNodeInfo -> CompNodeInfo -> Bool
$c>= :: CompNodeInfo -> CompNodeInfo -> Bool
>= :: CompNodeInfo -> CompNodeInfo -> Bool
$cmax :: CompNodeInfo -> CompNodeInfo -> CompNodeInfo
max :: CompNodeInfo -> CompNodeInfo -> CompNodeInfo
$cmin :: CompNodeInfo -> CompNodeInfo -> CompNodeInfo
min :: CompNodeInfo -> CompNodeInfo -> CompNodeInfo
Ord,
Int -> CompNodeInfo -> ShowS
[CompNodeInfo] -> ShowS
CompNodeInfo -> String
(Int -> CompNodeInfo -> ShowS)
-> (CompNodeInfo -> String)
-> ([CompNodeInfo] -> ShowS)
-> Show CompNodeInfo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CompNodeInfo -> ShowS
showsPrec :: Int -> CompNodeInfo -> ShowS
$cshow :: CompNodeInfo -> String
show :: CompNodeInfo -> String
$cshowList :: [CompNodeInfo] -> ShowS
showList :: [CompNodeInfo] -> ShowS
Show
)
data ValNodeInfo
= LitInternal AConstant
| AppInternal Id (Vector Ref)
| ThunkInternal Id
deriving stock
(
ValNodeInfo -> ValNodeInfo -> Bool
(ValNodeInfo -> ValNodeInfo -> Bool)
-> (ValNodeInfo -> ValNodeInfo -> Bool) -> Eq ValNodeInfo
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ValNodeInfo -> ValNodeInfo -> Bool
== :: ValNodeInfo -> ValNodeInfo -> Bool
$c/= :: ValNodeInfo -> ValNodeInfo -> Bool
/= :: ValNodeInfo -> ValNodeInfo -> Bool
Eq,
Eq ValNodeInfo
Eq ValNodeInfo =>
(ValNodeInfo -> ValNodeInfo -> Ordering)
-> (ValNodeInfo -> ValNodeInfo -> Bool)
-> (ValNodeInfo -> ValNodeInfo -> Bool)
-> (ValNodeInfo -> ValNodeInfo -> Bool)
-> (ValNodeInfo -> ValNodeInfo -> Bool)
-> (ValNodeInfo -> ValNodeInfo -> ValNodeInfo)
-> (ValNodeInfo -> ValNodeInfo -> ValNodeInfo)
-> Ord ValNodeInfo
ValNodeInfo -> ValNodeInfo -> Bool
ValNodeInfo -> ValNodeInfo -> Ordering
ValNodeInfo -> ValNodeInfo -> ValNodeInfo
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: ValNodeInfo -> ValNodeInfo -> Ordering
compare :: ValNodeInfo -> ValNodeInfo -> Ordering
$c< :: ValNodeInfo -> ValNodeInfo -> Bool
< :: ValNodeInfo -> ValNodeInfo -> Bool
$c<= :: ValNodeInfo -> ValNodeInfo -> Bool
<= :: ValNodeInfo -> ValNodeInfo -> Bool
$c> :: ValNodeInfo -> ValNodeInfo -> Bool
> :: ValNodeInfo -> ValNodeInfo -> Bool
$c>= :: ValNodeInfo -> ValNodeInfo -> Bool
>= :: ValNodeInfo -> ValNodeInfo -> Bool
$cmax :: ValNodeInfo -> ValNodeInfo -> ValNodeInfo
max :: ValNodeInfo -> ValNodeInfo -> ValNodeInfo
$cmin :: ValNodeInfo -> ValNodeInfo -> ValNodeInfo
min :: ValNodeInfo -> ValNodeInfo -> ValNodeInfo
Ord,
Int -> ValNodeInfo -> ShowS
[ValNodeInfo] -> ShowS
ValNodeInfo -> String
(Int -> ValNodeInfo -> ShowS)
-> (ValNodeInfo -> String)
-> ([ValNodeInfo] -> ShowS)
-> Show ValNodeInfo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ValNodeInfo -> ShowS
showsPrec :: Int -> ValNodeInfo -> ShowS
$cshow :: ValNodeInfo -> String
show :: ValNodeInfo -> String
$cshowList :: [ValNodeInfo] -> ShowS
showList :: [ValNodeInfo] -> ShowS
Show
)
data ASGNode
=
ACompNode (CompT AbstractTy) CompNodeInfo
|
AValNode (ValT AbstractTy) ValNodeInfo
|
AnError
deriving stock
(
ASGNode -> ASGNode -> Bool
(ASGNode -> ASGNode -> Bool)
-> (ASGNode -> ASGNode -> Bool) -> Eq ASGNode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ASGNode -> ASGNode -> Bool
== :: ASGNode -> ASGNode -> Bool
$c/= :: ASGNode -> ASGNode -> Bool
/= :: ASGNode -> ASGNode -> Bool
Eq,
Eq ASGNode
Eq ASGNode =>
(ASGNode -> ASGNode -> Ordering)
-> (ASGNode -> ASGNode -> Bool)
-> (ASGNode -> ASGNode -> Bool)
-> (ASGNode -> ASGNode -> Bool)
-> (ASGNode -> ASGNode -> Bool)
-> (ASGNode -> ASGNode -> ASGNode)
-> (ASGNode -> ASGNode -> ASGNode)
-> Ord ASGNode
ASGNode -> ASGNode -> Bool
ASGNode -> ASGNode -> Ordering
ASGNode -> ASGNode -> ASGNode
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: ASGNode -> ASGNode -> Ordering
compare :: ASGNode -> ASGNode -> Ordering
$c< :: ASGNode -> ASGNode -> Bool
< :: ASGNode -> ASGNode -> Bool
$c<= :: ASGNode -> ASGNode -> Bool
<= :: ASGNode -> ASGNode -> Bool
$c> :: ASGNode -> ASGNode -> Bool
> :: ASGNode -> ASGNode -> Bool
$c>= :: ASGNode -> ASGNode -> Bool
>= :: ASGNode -> ASGNode -> Bool
$cmax :: ASGNode -> ASGNode -> ASGNode
max :: ASGNode -> ASGNode -> ASGNode
$cmin :: ASGNode -> ASGNode -> ASGNode
min :: ASGNode -> ASGNode -> ASGNode
Ord,
Int -> ASGNode -> ShowS
[ASGNode] -> ShowS
ASGNode -> String
(Int -> ASGNode -> ShowS)
-> (ASGNode -> String) -> ([ASGNode] -> ShowS) -> Show ASGNode
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ASGNode -> ShowS
showsPrec :: Int -> ASGNode -> ShowS
$cshow :: ASGNode -> String
show :: ASGNode -> String
$cshowList :: [ASGNode] -> ShowS
showList :: [ASGNode] -> ShowS
Show
)
typeASGNode :: ASGNode -> ASGNodeType
typeASGNode :: ASGNode -> ASGNodeType
typeASGNode = \case
ACompNode CompT AbstractTy
t CompNodeInfo
_ -> CompT AbstractTy -> ASGNodeType
CompNodeType CompT AbstractTy
t
AValNode ValT AbstractTy
t ValNodeInfo
_ -> ValT AbstractTy -> ASGNodeType
ValNodeType ValT AbstractTy
t
ASGNode
AnError -> ASGNodeType
ErrorNodeType
data ASGNodeType
= CompNodeType (CompT AbstractTy)
| ValNodeType (ValT AbstractTy)
| ErrorNodeType
deriving stock
(
ASGNodeType -> ASGNodeType -> Bool
(ASGNodeType -> ASGNodeType -> Bool)
-> (ASGNodeType -> ASGNodeType -> Bool) -> Eq ASGNodeType
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ASGNodeType -> ASGNodeType -> Bool
== :: ASGNodeType -> ASGNodeType -> Bool
$c/= :: ASGNodeType -> ASGNodeType -> Bool
/= :: ASGNodeType -> ASGNodeType -> Bool
Eq,
Eq ASGNodeType
Eq ASGNodeType =>
(ASGNodeType -> ASGNodeType -> Ordering)
-> (ASGNodeType -> ASGNodeType -> Bool)
-> (ASGNodeType -> ASGNodeType -> Bool)
-> (ASGNodeType -> ASGNodeType -> Bool)
-> (ASGNodeType -> ASGNodeType -> Bool)
-> (ASGNodeType -> ASGNodeType -> ASGNodeType)
-> (ASGNodeType -> ASGNodeType -> ASGNodeType)
-> Ord ASGNodeType
ASGNodeType -> ASGNodeType -> Bool
ASGNodeType -> ASGNodeType -> Ordering
ASGNodeType -> ASGNodeType -> ASGNodeType
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: ASGNodeType -> ASGNodeType -> Ordering
compare :: ASGNodeType -> ASGNodeType -> Ordering
$c< :: ASGNodeType -> ASGNodeType -> Bool
< :: ASGNodeType -> ASGNodeType -> Bool
$c<= :: ASGNodeType -> ASGNodeType -> Bool
<= :: ASGNodeType -> ASGNodeType -> Bool
$c> :: ASGNodeType -> ASGNodeType -> Bool
> :: ASGNodeType -> ASGNodeType -> Bool
$c>= :: ASGNodeType -> ASGNodeType -> Bool
>= :: ASGNodeType -> ASGNodeType -> Bool
$cmax :: ASGNodeType -> ASGNodeType -> ASGNodeType
max :: ASGNodeType -> ASGNodeType -> ASGNodeType
$cmin :: ASGNodeType -> ASGNodeType -> ASGNodeType
min :: ASGNodeType -> ASGNodeType -> ASGNodeType
Ord,
Int -> ASGNodeType -> ShowS
[ASGNodeType] -> ShowS
ASGNodeType -> String
(Int -> ASGNodeType -> ShowS)
-> (ASGNodeType -> String)
-> ([ASGNodeType] -> ShowS)
-> Show ASGNodeType
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ASGNodeType -> ShowS
showsPrec :: Int -> ASGNodeType -> ShowS
$cshow :: ASGNodeType -> String
show :: ASGNodeType -> String
$cshowList :: [ASGNodeType] -> ShowS
showList :: [ASGNodeType] -> ShowS
Show
)