@@ -15,7 +15,10 @@
1515
1616module Types where
1717
18−import qualified Data.Map as M
18+import Data.Set (Set)
19+import qualified Data.Set as Set
20+import Data.Map (Map)
21+import qualified Data.Map as Map
1922import qualified Language.PureScript as P
2023
2124data PSCiOptions = PSCiOptions
@@ -32,14 +35,48 @@ data PSCiOptions = PSCiOptions
3235-- because it makes more sense to apply the binding to the final evaluated expression.
3336--
3437data PSCiState = PSCiState
35− { psciImportedFilenames :: [FilePath]
38+ { _psciImportedFilenames :: Set FilePath
3639 , psciImportedModules :: [ImportedModule]
37− , psciLoadedModules :: [(Either P.RebuildPolicy FilePath, P.Module)]
38− , psciForeignFiles :: M.Map P.ModuleName FilePath
40+ , _psciLoadedModules :: Map P.ModuleName (Either P.RebuildPolicy FilePath, P.Module)
41+ , psciForeignFiles :: Map P.ModuleName FilePath
3942 , psciLetBindings :: [P.Declaration]
4043 , psciNodeFlags :: [String]
4144 }
4245
46+-- Public psci state accessors
47+
48+-- | Get the imported filenames as a list.
49+psciImportedFilenames :: PSCiState -> [FilePath]
50+psciImportedFilenames = Set.toList . _psciImportedFilenames
51+
52+-- | Get the loaded modules as a list.
53+psciLoadedModules :: PSCiState -> [(Either P.RebuildPolicy FilePath, P.Module)]
54+psciLoadedModules = Map.elems . _psciLoadedModules
55+
56+mkPSCiState :: [FilePath]
57+ -> [ImportedModule]
58+ -> [(Either P.RebuildPolicy FilePath, P.Module)]
59+ -> Map P.ModuleName FilePath
60+ -> [P.Declaration]
61+ -> [String]
62+ -> PSCiState
63+mkPSCiState files imported loaded foreign lets nodeFlags =
64+ (initialPSCiState
65+ |> each files updateImportedFiles
66+ |> each imported updateImportedModules
67+ |> updateModules loaded)
68+ { psciForeignFiles = foreign
69+ , psciLetBindings = lets
70+ , psciNodeFlags = nodeFlags
71+ }
72+ where
73+ x |> f = f x
74+ each xs f st = foldl (flip f) st xs
75+
76+initialPSCiState :: PSCiState
77+initialPSCiState =
78+ PSCiState Set.empty [] Map.empty Map.empty [] []
79+
4380-- | All of the data that is contained by an ImportDeclaration in the AST.
4481-- That is:
4582--
@@ -65,10 +102,10 @@ allImportsOf m (PSCiState{psciImportedModules = is}) =
65102-- State helpers
66103
67104-- |
68−-- Updates the state to have more imported modules.
105+-- Updates the state to have more imported files.
69106--
70107updateImportedFiles :: FilePath -> PSCiState -> PSCiState
71−updateImportedFiles filename st = st { psciImportedFilenames = filename : psciImportedFilenames st }
108+updateImportedFiles filename st = st { _psciImportedFilenames = Set.insert filename (_psciImportedFilenames st) }
72109
73110-- |
74111-- Updates the state to have more imported modules.
@@ -80,7 +117,10 @@ updateImportedModules im st = st { psciImportedModules = im : psciImportedModule
80117-- Updates the state to have more loaded files.
81118--
82119updateModules :: [(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 }
122+ where
123+ keyFor = P.getModuleName . snd
84124
85125-- |
86126-- Updates the state to have more let bindings.
@@ -91,8 +131,8 @@ updateLets ds st = st { psciLetBindings = psciLetBindings st ++ ds }
91131-- |
92132-- Updates the state to have more let bindings.
93133--
94−updateForeignFiles :: M.Map P.ModuleName FilePath -> PSCiState -> PSCiState
95−updateForeignFiles fs st = st { psciForeignFiles = psciForeignFiles st `M.union` fs }
134+updateForeignFiles :: Map P.ModuleName FilePath -> PSCiState -> PSCiState
135+updateForeignFiles fs st = st { psciForeignFiles = psciForeignFiles st `Map.union` fs }
96136
97137-- |
98138-- Valid Meta-commands for PSCI