{-# LANGUAGE OverloadedStrings #-}
module Front.Identifiers where
import Common.Default (Default (..))
import Common.Identifiers
import qualified Data.Map as M
data IdKind
=
User
|
Builtin
|
Reserved
deriving (Int -> IdKind -> ShowS
[IdKind] -> ShowS
IdKind -> String
(Int -> IdKind -> ShowS)
-> (IdKind -> String) -> ([IdKind] -> ShowS) -> Show IdKind
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [IdKind] -> ShowS
$cshowList :: [IdKind] -> ShowS
show :: IdKind -> String
$cshow :: IdKind -> String
showsPrec :: Int -> IdKind -> ShowS
$cshowsPrec :: Int -> IdKind -> ShowS
Show, IdKind -> IdKind -> Bool
(IdKind -> IdKind -> Bool)
-> (IdKind -> IdKind -> Bool) -> Eq IdKind
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: IdKind -> IdKind -> Bool
$c/= :: IdKind -> IdKind -> Bool
== :: IdKind -> IdKind -> Bool
$c== :: IdKind -> IdKind -> Bool
Eq)
newtype DataInfo = DataInfo {DataInfo -> IdKind
dataKind :: IdKind}
newtype TypInfo = TypInfo {TypInfo -> IdKind
typKind :: IdKind}
instance Default DataInfo where
def :: DataInfo
def = DataInfo :: IdKind -> DataInfo
DataInfo{dataKind :: IdKind
dataKind = IdKind
User}
instance Default TypInfo where
def :: TypInfo
def = TypInfo :: IdKind -> TypInfo
TypInfo{typKind :: IdKind
typKind = IdKind
User}
builtinTypes :: M.Map Identifier TypInfo
builtinTypes :: Map Identifier TypInfo
builtinTypes = [(Identifier, TypInfo)] -> Map Identifier TypInfo
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([(Identifier, TypInfo)] -> Map Identifier TypInfo)
-> [(Identifier, TypInfo)] -> Map Identifier TypInfo
forall a b. (a -> b) -> a -> b
$ (Identifier -> (Identifier, TypInfo))
-> [Identifier] -> [(Identifier, TypInfo)]
forall a b. (a -> b) -> [a] -> [b]
map Identifier -> (Identifier, TypInfo)
forall a. a -> (a, TypInfo)
mkBuiltin [Identifier
"Int", Identifier
"Time", Identifier
"[]", Identifier
"&", Identifier
"()"]
where
mkBuiltin :: a -> (a, TypInfo)
mkBuiltin a
i = (a
i, TypInfo :: IdKind -> TypInfo
TypInfo{typKind :: IdKind
typKind = IdKind
Builtin})
builtinData :: M.Map Identifier DataInfo
builtinData :: Map Identifier DataInfo
builtinData =
[(Identifier, DataInfo)] -> Map Identifier DataInfo
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([(Identifier, DataInfo)] -> Map Identifier DataInfo)
-> [(Identifier, DataInfo)] -> Map Identifier DataInfo
forall a b. (a -> b) -> a -> b
$
(Identifier -> (Identifier, DataInfo))
-> [Identifier] -> [(Identifier, DataInfo)]
forall a b. (a -> b) -> [a] -> [b]
map
Identifier -> (Identifier, DataInfo)
forall a. a -> (a, DataInfo)
mkBuiltin
[ Identifier
"-"
, Identifier
"+"
, Identifier
"*"
, Identifier
"/"
, Identifier
"%"
, Identifier
"=="
, Identifier
"!="
, Identifier
"<="
, Identifier
">="
, Identifier
"<"
, Identifier
">"
, Identifier
"!"
, Identifier
"deref"
, Identifier
"new"
]
where
mkBuiltin :: a -> (a, DataInfo)
mkBuiltin a
i = (a
i, DataInfo :: IdKind -> DataInfo
DataInfo{dataKind :: IdKind
dataKind = IdKind
Builtin})