{-# LANGUAGE DeriveDataTypeable, OverloadedStrings, FlexibleInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans -fno-warn-name-shadowing #-}
module Language.Haskell.Names.Environment
(
Environment
, loadBase
, readSymbols
, writeSymbols
, SymbolsFileException(..)
) where
import Language.Haskell.Names.Types (Environment, Symbol(..))
import Language.Haskell.Exts (ModuleName(ModuleName),Name,prettyPrint)
import Language.Haskell.Names.SyntaxUtils (stringToName,nameToString,dropAnn, annName)
import qualified Data.ByteString.Lazy as BS (readFile, writeFile, pack)
import Data.Aeson
import Data.Char
import Data.Typeable
import Control.Exception
import Control.Monad
import System.FilePath ((</>), (<.>))
import qualified Data.Map as Map (fromList)
import Data.Traversable (for)
import Paths_haskell_names (getDataDir)
readSymbols :: FilePath -> IO [Symbol]
readSymbols :: String -> IO [Symbol]
readSymbols String
path =
(String -> IO [Symbol])
-> ([Symbol] -> IO [Symbol])
-> Either String [Symbol]
-> IO [Symbol]
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (SymbolsFileException -> IO [Symbol]
forall e a. Exception e => e -> IO a
throwIO (SymbolsFileException -> IO [Symbol])
-> (String -> SymbolsFileException) -> String -> IO [Symbol]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> SymbolsFileException
BadSymbolsFile String
path) [Symbol] -> IO [Symbol]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Either String [Symbol] -> IO [Symbol])
-> IO (Either String [Symbol]) -> IO [Symbol]
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<
ByteString -> Either String [Symbol]
forall a. FromJSON a => ByteString -> Either String a
eitherDecode (ByteString -> Either String [Symbol])
-> IO ByteString -> IO (Either String [Symbol])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> IO ByteString
BS.readFile String
path
writeSymbols :: FilePath -> [Symbol] -> IO ()
writeSymbols :: String -> [Symbol] -> IO ()
writeSymbols String
path [Symbol]
symbols =
String -> ByteString -> IO ()
BS.writeFile String
path (ByteString -> IO ()) -> ByteString -> IO ()
forall a b. (a -> b) -> a -> b
$
[Symbol] -> ByteString
forall a. ToJSON a => a -> ByteString
encode [Symbol]
symbols ByteString -> ByteString -> ByteString
forall a. Monoid a => a -> a -> a
`mappend` [Word8] -> ByteString
BS.pack [Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word8) -> Int -> Word8
forall a b. (a -> b) -> a -> b
$ Char -> Int
ord Char
'\n']
data SymbolsFileException =
BadSymbolsFile FilePath String
deriving (Typeable, Int -> SymbolsFileException -> ShowS
[SymbolsFileException] -> ShowS
SymbolsFileException -> String
(Int -> SymbolsFileException -> ShowS)
-> (SymbolsFileException -> String)
-> ([SymbolsFileException] -> ShowS)
-> Show SymbolsFileException
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SymbolsFileException -> ShowS
showsPrec :: Int -> SymbolsFileException -> ShowS
$cshow :: SymbolsFileException -> String
show :: SymbolsFileException -> String
$cshowList :: [SymbolsFileException] -> ShowS
showList :: [SymbolsFileException] -> ShowS
Show)
instance Exception SymbolsFileException
prettyName :: Name () -> String
prettyName :: Name () -> String
prettyName = Name () -> String
forall l. Name l -> String
nameToString (Name () -> String) -> (Name () -> Name ()) -> Name () -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name () -> Name ()
forall a. a -> a
annName
instance ToJSON Symbol where
toJSON :: Symbol -> Value
toJSON Symbol
symbol =
[Pair] -> Value
object ([
Key
"entity" Key -> String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Symbol -> String
symbolEntity Symbol
symbol,
Key
"module" Key -> String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= ModuleName () -> String
forall a. Pretty a => a -> String
prettyPrint (Symbol -> ModuleName ()
symbolModule Symbol
symbol),
Key
"name" Key -> String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Name () -> String
prettyName (Symbol -> Name ()
symbolName Symbol
symbol)] [Pair] -> [Pair] -> [Pair]
forall a. [a] -> [a] -> [a]
++ Symbol -> [Pair]
forall {e} {a}. KeyValue e a => Symbol -> [a]
additionalInfo Symbol
symbol)
where
additionalInfo :: Symbol -> [a]
additionalInfo Symbol
symbol = case Symbol
symbol of
Method { className :: Symbol -> Name ()
className = Name ()
cls } ->
[Key
"class" Key -> String -> a
forall v. ToJSON v => Key -> v -> a
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Name () -> String
prettyName Name ()
cls]
Selector { typeName :: Symbol -> Name ()
typeName = Name ()
ty, constructors :: Symbol -> [Name ()]
constructors = [Name ()]
cons } ->
[Key
"type" Key -> String -> a
forall v. ToJSON v => Key -> v -> a
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Name () -> String
prettyName Name ()
ty
,Key
"constructors"Key -> [String] -> a
forall v. ToJSON v => Key -> v -> a
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Name () -> String) -> [Name ()] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Name () -> String
prettyName [Name ()]
cons]
Constructor { typeName :: Symbol -> Name ()
typeName = Name ()
ty } ->
[Key
"type" Key -> String -> a
forall v. ToJSON v => Key -> v -> a
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Name () -> String
prettyName Name ()
ty]
TypeFam { associate :: Symbol -> Maybe (Name ())
associate = Maybe (Name ())
as } ->
[Key
"associate" Key -> Maybe String -> a
forall v. ToJSON v => Key -> v -> a
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Name () -> String) -> Maybe (Name ()) -> Maybe String
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Name () -> String
prettyName Maybe (Name ())
as]
DataFam { associate :: Symbol -> Maybe (Name ())
associate = Maybe (Name ())
as } ->
[Key
"associate" Key -> Maybe String -> a
forall v. ToJSON v => Key -> v -> a
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Name () -> String) -> Maybe (Name ()) -> Maybe String
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Name () -> String
prettyName Maybe (Name ())
as]
PatternConstructor { patternTypeName :: Symbol -> Maybe (Name ())
patternTypeName = Maybe (Name ())
mty } ->
[Key
"patternTypeName" Key -> Maybe String -> a
forall v. ToJSON v => Key -> v -> a
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Name () -> String) -> Maybe (Name ()) -> Maybe String
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Name () -> String
prettyName Maybe (Name ())
mty]
PatternSelector { patternTypeName :: Symbol -> Maybe (Name ())
patternTypeName = Maybe (Name ())
mty, patternConstructorName :: Symbol -> Name ()
patternConstructorName = Name ()
pn } ->
[Key
"patternTypeName" Key -> Maybe String -> a
forall v. ToJSON v => Key -> v -> a
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Name () -> String) -> Maybe (Name ()) -> Maybe String
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Name () -> String
prettyName Maybe (Name ())
mty
,Key
"patternConstructorName" Key -> String -> a
forall v. ToJSON v => Key -> v -> a
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Name () -> String
prettyName Name ()
pn]
Symbol
_ -> []
symbolEntity :: Symbol -> String
symbolEntity :: Symbol -> String
symbolEntity Symbol
i = case Symbol
i of
Value {} -> String
"value"
Method {} -> String
"method"
Selector {} -> String
"selector"
Constructor {} -> String
"constructor"
Type {} -> String
"type"
Data {} -> String
"data"
NewType {} -> String
"newtype"
TypeFam {} -> String
"typeFamily"
DataFam {} -> String
"dataFamily"
Class {} -> String
"class"
PatternConstructor {} -> String
"patternConstructor"
PatternSelector {} -> String
"patternSelector"
parseName :: String -> Name ()
parseName :: String -> Name ()
parseName = Name () -> Name ()
forall (a :: * -> *) l. Functor a => a l -> a ()
dropAnn (Name () -> Name ()) -> (String -> Name ()) -> String -> Name ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Name ()
stringToName
instance FromJSON Symbol where
parseJSON :: Value -> Parser Symbol
parseJSON (Object Object
v) = do
String
entity <- Object
v Object -> Key -> Parser String
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"entity"
ModuleName ()
symbolmodule <- () -> String -> ModuleName ()
forall l. l -> String -> ModuleName l
ModuleName () (String -> ModuleName ())
-> Parser String -> Parser (ModuleName ())
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser String
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"module"
Name ()
symbolname <- String -> Name ()
parseName (String -> Name ()) -> Parser String -> Parser (Name ())
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser String
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"name"
case String
entity :: String of
String
"value" -> Symbol -> Parser Symbol
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (Symbol -> Parser Symbol) -> Symbol -> Parser Symbol
forall a b. (a -> b) -> a -> b
$ ModuleName () -> Name () -> Symbol
Value ModuleName ()
symbolmodule Name ()
symbolname
String
"method" -> do
String
cls <- Object
v Object -> Key -> Parser String
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"class"
Symbol -> Parser Symbol
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (ModuleName () -> Name () -> Name () -> Symbol
Method ModuleName ()
symbolmodule Name ()
symbolname (String -> Name ()
parseName String
cls))
String
"selector" -> do
String
typ <- Object
v Object -> Key -> Parser String
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"type"
[String]
cons <- Object
v Object -> Key -> Parser [String]
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"constructors"
Symbol -> Parser Symbol
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (ModuleName () -> Name () -> Name () -> [Name ()] -> Symbol
Selector ModuleName ()
symbolmodule Name ()
symbolname (String -> Name ()
parseName String
typ) ((String -> Name ()) -> [String] -> [Name ()]
forall a b. (a -> b) -> [a] -> [b]
map String -> Name ()
parseName [String]
cons))
String
"constructor" -> do
String
typ <- Object
v Object -> Key -> Parser String
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"type"
Symbol -> Parser Symbol
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (ModuleName () -> Name () -> Name () -> Symbol
Constructor ModuleName ()
symbolmodule Name ()
symbolname (String -> Name ()
parseName String
typ))
String
"type" -> Symbol -> Parser Symbol
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (Symbol -> Parser Symbol) -> Symbol -> Parser Symbol
forall a b. (a -> b) -> a -> b
$ ModuleName () -> Name () -> Symbol
Type ModuleName ()
symbolmodule Name ()
symbolname
String
"data" -> Symbol -> Parser Symbol
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (Symbol -> Parser Symbol) -> Symbol -> Parser Symbol
forall a b. (a -> b) -> a -> b
$ ModuleName () -> Name () -> Symbol
Data ModuleName ()
symbolmodule Name ()
symbolname
String
"newtype" -> Symbol -> Parser Symbol
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (Symbol -> Parser Symbol) -> Symbol -> Parser Symbol
forall a b. (a -> b) -> a -> b
$ ModuleName () -> Name () -> Symbol
NewType ModuleName ()
symbolmodule Name ()
symbolname
String
"typeFamily" -> do
Maybe (Name ())
associate <- (String -> Name ()) -> Maybe String -> Maybe (Name ())
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap String -> Name ()
parseName (Maybe String -> Maybe (Name ()))
-> Parser (Maybe String) -> Parser (Maybe (Name ()))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"associate"
Symbol -> Parser Symbol
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (Symbol -> Parser Symbol) -> Symbol -> Parser Symbol
forall a b. (a -> b) -> a -> b
$ ModuleName () -> Name () -> Maybe (Name ()) -> Symbol
TypeFam ModuleName ()
symbolmodule Name ()
symbolname Maybe (Name ())
associate
String
"dataFamily" -> do
Maybe (Name ())
associate <- (String -> Name ()) -> Maybe String -> Maybe (Name ())
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap String -> Name ()
parseName (Maybe String -> Maybe (Name ()))
-> Parser (Maybe String) -> Parser (Maybe (Name ()))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"associate"
Symbol -> Parser Symbol
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (Symbol -> Parser Symbol) -> Symbol -> Parser Symbol
forall a b. (a -> b) -> a -> b
$ ModuleName () -> Name () -> Maybe (Name ()) -> Symbol
DataFam ModuleName ()
symbolmodule Name ()
symbolname Maybe (Name ())
associate
String
"class" -> Symbol -> Parser Symbol
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (Symbol -> Parser Symbol) -> Symbol -> Parser Symbol
forall a b. (a -> b) -> a -> b
$ ModuleName () -> Name () -> Symbol
Class ModuleName ()
symbolmodule Name ()
symbolname
String
"patternConstructor" -> do
Maybe (Name ())
typ <- (String -> Name ()) -> Maybe String -> Maybe (Name ())
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap String -> Name ()
parseName (Maybe String -> Maybe (Name ()))
-> Parser (Maybe String) -> Parser (Maybe (Name ()))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"patternTypeName"
Symbol -> Parser Symbol
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (ModuleName () -> Name () -> Maybe (Name ()) -> Symbol
PatternConstructor ModuleName ()
symbolmodule Name ()
symbolname Maybe (Name ())
typ)
String
"patternSelector" -> do
Maybe (Name ())
typ <- (String -> Name ()) -> Maybe String -> Maybe (Name ())
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap String -> Name ()
parseName (Maybe String -> Maybe (Name ()))
-> Parser (Maybe String) -> Parser (Maybe (Name ()))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"patternTypeName"
Name ()
patternname <- String -> Name ()
parseName (String -> Name ()) -> Parser String -> Parser (Name ())
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser String
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"patternConstructorName"
Symbol -> Parser Symbol
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (ModuleName () -> Name () -> Maybe (Name ()) -> Name () -> Symbol
PatternSelector ModuleName ()
symbolmodule Name ()
symbolname Maybe (Name ())
typ Name ()
patternname)
String
_ -> Parser Symbol
forall a. Parser a
forall (m :: * -> *) a. MonadPlus m => m a
mzero
parseJSON Value
_ = Parser Symbol
forall a. Parser a
forall (m :: * -> *) a. MonadPlus m => m a
mzero
loadBase :: IO Environment
loadBase :: IO Environment
loadBase = do
[(ModuleName (), [Symbol])]
moduleSymbols <- [ModuleName ()]
-> (ModuleName () -> IO (ModuleName (), [Symbol]))
-> IO [(ModuleName (), [Symbol])]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
t a -> (a -> f b) -> f (t b)
for [ModuleName ()]
baseModules (\ModuleName ()
moduleName -> do
String
dataDir <- IO String
getDataDir
let path :: String
path = String
dataDir String -> ShowS
</> String
"data" String -> ShowS
</> String
"baseEnvironment" String -> ShowS
</>
ModuleName () -> String
forall a. Pretty a => a -> String
prettyPrint ModuleName ()
moduleName String -> ShowS
<.> String
"symbols"
[Symbol]
symbols <- String -> IO [Symbol]
readSymbols String
path
(ModuleName (), [Symbol]) -> IO (ModuleName (), [Symbol])
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (ModuleName ()
moduleName, [Symbol]
symbols))
Environment -> IO Environment
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ([(ModuleName (), [Symbol])] -> Environment
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [(ModuleName (), [Symbol])]
moduleSymbols)
baseModules :: [ModuleName ()]
baseModules :: [ModuleName ()]
baseModules = (String -> ModuleName ()) -> [String] -> [ModuleName ()]
forall a b. (a -> b) -> [a] -> [b]
map (() -> String -> ModuleName ()
forall l. l -> String -> ModuleName l
ModuleName ()) [String
"Control.Applicative",String
"Control.Arrow",String
"Control.Category",String
"Control.Concurrent.Chan",String
"Control.Concurrent.MVar",String
"Control.Concurrent.QSem",String
"Control.Concurrent.QSemN",String
"Control.Concurrent",String
"Control.Exception.Base",String
"Control.Exception",String
"Control.Monad.Fix",String
"Control.Monad.Instances",String
"Control.Monad.ST.Imp",String
"Control.Monad.ST.Lazy.Imp",String
"Control.Monad.ST.Lazy.Safe",String
"Control.Monad.ST.Lazy.Unsafe",String
"Control.Monad.ST.Lazy",String
"Control.Monad.ST.Safe",String
"Control.Monad.ST.Strict",String
"Control.Monad.ST.Unsafe",String
"Control.Monad.ST",String
"Control.Monad.Zip",String
"Control.Monad",String
"Data.Bits",String
"Data.Bool",String
"Data.Char",String
"Data.Complex",String
"Data.Data",String
"Data.Dynamic",String
"Data.Either",String
"Data.Eq",String
"Data.Fixed",String
"Data.Foldable",String
"Data.Function",String
"Data.Functor",String
"Data.IORef",String
"Data.Int",String
"Data.Ix",String
"Data.List",String
"Data.Maybe",String
"Data.Monoid",String
"Data.OldTypeable.Internal",String
"Data.OldTypeable",String
"Data.Ord",String
"Data.Ratio",String
"Data.STRef.Lazy",String
"Data.STRef.Strict",String
"Data.STRef",String
"Data.String",String
"Data.Traversable",String
"Data.Tuple",String
"Data.Typeable.Internal",String
"Data.Typeable",String
"Data.Unique",String
"Data.Version",String
"Data.Word",String
"Debug.Trace",String
"Foreign.C.Error",String
"Foreign.C.String",String
"Foreign.C.Types",String
"Foreign.C",String
"Foreign.Concurrent",String
"Foreign.ForeignPtr.Imp",String
"Foreign.ForeignPtr.Safe",String
"Foreign.ForeignPtr.Unsafe",String
"Foreign.ForeignPtr",String
"Foreign.Marshal.Alloc",String
"Foreign.Marshal.Array",String
"Foreign.Marshal.Error",String
"Foreign.Marshal.Pool",String
"Foreign.Marshal.Safe",String
"Foreign.Marshal.Unsafe",String
"Foreign.Marshal.Utils",String
"Foreign.Marshal",String
"Foreign.Ptr",String
"Foreign.Safe",String
"Foreign.StablePtr",String
"Foreign.Storable",String
"Foreign",String
"GHC.Arr",String
"GHC.Base",String
"GHC.Char",String
"GHC.Conc.IO",String
"GHC.Conc.Signal",String
"GHC.Conc.Sync",String
"GHC.Conc",String
"GHC.ConsoleHandler",String
"GHC.Constants",String
"GHC.Desugar",String
"GHC.Enum",String
"GHC.Environment",String
"GHC.Err",String
"GHC.Event.Array",String
"GHC.Event.Clock",String
"GHC.Event.Control",String
"GHC.Event.EPoll",String
"GHC.Event.IntMap",String
"GHC.Event.Internal",String
"GHC.Event.KQueue",String
"GHC.Event.Manager",String
"GHC.Event.PSQ",String
"GHC.Event.Poll",String
"GHC.Event.Thread",String
"GHC.Event.TimerManager",String
"GHC.Event.Unique",String
"GHC.Event",String
"GHC.Exception",String
"GHC.Exts",String
"GHC.Fingerprint.Type",String
"GHC.Fingerprint",String
"GHC.Float.ConversionUtils",String
"GHC.Float.RealFracMethods",String
"GHC.Float",String
"GHC.Foreign",String
"GHC.ForeignPtr",String
"GHC.GHCi",String
"GHC.Generics",String
"GHC.IO.Buffer",String
"GHC.IO.BufferedIO",String
"GHC.IO.Device",String
"GHC.IO.Encoding.CodePage",String
"GHC.IO.Encoding.Failure",String
"GHC.IO.Encoding.Iconv",String
"GHC.IO.Encoding.Latin1",String
"GHC.IO.Encoding.Types",String
"GHC.IO.Encoding.UTF16",String
"GHC.IO.Encoding.UTF32",String
"GHC.IO.Encoding.UTF8",String
"GHC.IO.Encoding",String
"GHC.IO.Exception",String
"GHC.IO.FD",String
"GHC.IO.Handle.FD",String
"GHC.IO.Handle.Internals",String
"GHC.IO.Handle.Text",String
"GHC.IO.Handle.Types",String
"GHC.IO.Handle",String
"GHC.IO.IOMode",String
"GHC.IO",String
"GHC.IOArray",String
"GHC.IORef",String
"GHC.IP",String
"GHC.Int",String
"GHC.List",String
"GHC.MVar",String
"GHC.Num",String
"GHC.PArr",String
"GHC.Pack",String
"GHC.Profiling",String
"GHC.Ptr",String
"GHC.Read",String
"GHC.Real",String
"GHC.ST",String
"GHC.STRef",String
"GHC.Show",String
"GHC.Stable",String
"GHC.Stack",String
"GHC.Stats",String
"GHC.Storable",String
"GHC.TopHandler",String
"GHC.TypeLits",String
"GHC.Unicode",String
"GHC.Weak",String
"GHC.Word",String
"Numeric",String
"Prelude",String
"System.CPUTime",String
"System.Console.GetOpt",String
"System.Environment.ExecutablePath",String
"System.Environment",String
"System.Exit",String
"System.IO.Error",String
"System.IO.Unsafe",String
"System.IO",String
"System.Info",String
"System.Mem.StableName",String
"System.Mem.Weak",String
"System.Mem",String
"System.Posix.Internals",String
"System.Posix.Types",String
"System.Timeout",String
"Text.ParserCombinators.ReadP",String
"Text.ParserCombinators.ReadPrec",String
"Text.Printf",String
"Text.Read.Lex",String
"Text.Read",String
"Text.Show.Functions",String
"Text.Show",String
"Unsafe.Coerce",String
"GHC.CString",String
"GHC.Classes",String
"GHC.Debug",String
"GHC.IntWord64",String
"GHC.Magic",String
"GHC.Prim",String
"GHC.PrimopWrappers",String
"GHC.Tuple",String
"GHC.Types",String
"GHC.Integer.Logarithms.Internals",String
"GHC.Integer.Logarithms",String
"GHC.Integer.Simple.Internals",String
"GHC.Integer.Type",String
"GHC.Integer"]