{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveLift #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE DataKinds #-}
module Data.Morpheus.Types.Internal.AST.Base
( Key
, Collection
, Ref(..)
, Position(..)
, Message
, anonymousRef
, Name
, Description
, VALID
, RAW
, TypeWrapper(..)
, Stage(..)
, RESOLVED
, TypeRef(..)
, removeDuplicates
, elementOfKeys
, VALIDATION_MODE(..)
)
where
import Data.Aeson ( FromJSON
, ToJSON
)
import Data.Text ( Text )
import GHC.Generics ( Generic )
import Language.Haskell.TH.Syntax ( Lift )
import Instances.TH.Lift ( )
import qualified Data.Set as S
type Key = Text
type Message = Text
type Name = Key
type Description = Key
type Collection a = [(Key, a)]
data Stage = RAW | RESOLVED | VALID
type RAW = 'RAW
type RESOLVED = 'RESOLVED
type VALID = 'VALID
data Position = Position
{ line :: Int
, column :: Int
} deriving (Show, Generic, FromJSON, ToJSON, Lift)
data Ref = Ref
{ refName :: Key
, refPosition :: Position
} deriving (Show,Lift)
instance Eq Ref where
(Ref id1 _) == (Ref id2 _) = id1 == id2
instance Ord Ref where
compare (Ref x _) (Ref y _) = compare x y
anonymousRef :: Key -> Ref
anonymousRef refName = Ref { refName, refPosition = Position 0 0 }
data TypeWrapper
= TypeList
| TypeMaybe
deriving (Show, Lift)
data TypeRef = TypeRef
{ typeConName :: Name
, typeArgs :: Maybe Name
, typeWrappers :: [TypeWrapper]
} deriving (Show,Lift)
data VALIDATION_MODE
= WITHOUT_VARIABLES
| FULL_VALIDATION
deriving (Eq, Show)
removeDuplicates :: Ord a => [a] -> [a]
removeDuplicates = S.toList . S.fromList
elementOfKeys :: [Name] -> Ref -> Bool
elementOfKeys keys Ref { refName } = refName `elem` keys