@@ -15,7 +15,10 @@
16module Types where
16module Types where
19+import qualified Data.Set as Set
18−import qualified Data.Map as M
21+import qualified Data.Map as Map
19import qualified Language.PureScript as P
22import qualified Language.PureScript as P
21data PSCiOptions = PSCiOptions
24data PSCiOptions = PSCiOptions
@@ -32,14 +35,48 @@ data PSCiOptions = PSCiOptions
32-- because it makes more sense to apply the binding to the final evaluated expression.
35-- because it makes more sense to apply the binding to the final evaluated expression.
34data PSCiState = PSCiState
37data PSCiState = PSCiState
35− { psciImportedFilenames :: [FilePath]
38+ { _psciImportedFilenames :: Set FilePath
36 , psciImportedModules :: [ImportedModule]
39 , psciImportedModules :: [ImportedModule]
37− , psciLoadedModules :: [(Either P.RebuildPolicy FilePath, P.Module)]
40+ , _psciLoadedModules :: Map P.ModuleName (Either P.RebuildPolicy FilePath, P.Module)
38− , psciForeignFiles :: M.Map P.ModuleName FilePath
41+ , psciForeignFiles :: Map P.ModuleName FilePath
39 , psciLetBindings :: [P.Declaration]
42 , psciLetBindings :: [P.Declaration]
40 , psciNodeFlags :: [String]
43 , psciNodeFlags :: [String]
46+-- Public psci state accessors
48+-- | Get the imported filenames as a list.
49+psciImportedFilenames :: PSCiState -> [FilePath]
50+psciImportedFilenames = Set.toList . _psciImportedFilenames
52+-- | Get the loaded modules as a list.
53+psciLoadedModules :: PSCiState -> [(Either P.RebuildPolicy FilePath, P.Module)]
54+psciLoadedModules = Map.elems . _psciLoadedModules
56+mkPSCiState :: [FilePath]
58+ -> [(Either P.RebuildPolicy FilePath, P.Module)]
59+ -> Map P.ModuleName FilePath
63+mkPSCiState files imported loaded foreign lets nodeFlags =
65+ |> each files updateImportedFiles
66+ |> each imported updateImportedModules
67+ |> updateModules loaded)
68+ { psciForeignFiles = foreign
69+ , psciLetBindings = lets
70+ , psciNodeFlags = nodeFlags
74+ each xs f st = foldl (flip f) st xs
76+initialPSCiState :: PSCiState
78+ PSCiState Set.empty [] Map.empty Map.empty [] []
43-- | All of the data that is contained by an ImportDeclaration in the AST.
80-- | All of the data that is contained by an ImportDeclaration in the AST.
44-- That is:
81-- That is:
@@ -65,10 +102,10 @@ allImportsOf m (PSCiState{psciImportedModules = is}) =
65-- State helpers
102-- State helpers
68−-- Updates the state to have more imported modules.
105+-- Updates the state to have more imported files.
70updateImportedFiles :: FilePath -> PSCiState -> PSCiState
107updateImportedFiles :: FilePath -> PSCiState -> PSCiState
71−updateImportedFiles filename st = st { psciImportedFilenames = filename : psciImportedFilenames st }
108+updateImportedFiles filename st = st { _psciImportedFilenames = Set.insert filename (_psciImportedFilenames st) }
74-- Updates the state to have more imported modules.
111-- Updates the state to have more imported modules.
@@ -80,7 +117,10 @@ updateImportedModules im st = st { psciImportedModules = im : psciImportedModule
80-- Updates the state to have more loaded files.
117-- Updates the state to have more loaded files.
82updateModules :: [(Either P.RebuildPolicy FilePath, P.Module)] -> PSCiState -> PSCiState
119updateModules :: [(Either P.RebuildPolicy FilePath, P.Module)] -> PSCiState -> PSCiState
83−updateModules modules st = st { psciLoadedModules = psciLoadedModules st ++ modules }
120+updateModules modules st =
121+ st { _psciLoadedModules = foldl (\m mdl -> Map.insert (keyFor mdl) mdl m) (_psciLoadedModules st) modules }
123+ keyFor = P.getModuleName . snd
86-- Updates the state to have more let bindings.
126-- Updates the state to have more let bindings.
@@ -91,8 +131,8 @@ updateLets ds st = st { psciLetBindings = psciLetBindings st ++ ds }
92-- Updates the state to have more let bindings.
132-- Updates the state to have more let bindings.
94−updateForeignFiles :: M.Map P.ModuleName FilePath -> PSCiState -> PSCiState
134+updateForeignFiles :: Map P.ModuleName FilePath -> PSCiState -> PSCiState
95−updateForeignFiles fs st = st { psciForeignFiles = psciForeignFiles st `M.union` fs }
135+updateForeignFiles fs st = st { psciForeignFiles = psciForeignFiles st `Map.union` fs }
98-- Valid Meta-commands for PSCI
138-- Valid Meta-commands for PSCI