module Rakka.Environment
( Environment(..)
+ , InterpTable
, setupEnv
+ , getInterpTable
+ , getInterpTableA
)
where
+import Control.Arrow.ArrowIO
+import Data.IORef
+import Data.Map (Map)
+import qualified Data.Map as M
import Network
import qualified Network.HTTP.Lucu.Config as LC
import Rakka.Storage
import Rakka.SystemConfig
+import Rakka.Wiki.Interpreter
+import Rakka.Wiki.Interpreter.Base
data Environment = Environment {
, envLucuConf :: !LC.Config
, envStorage :: !Storage
, envSysConf :: !SystemConfig
+ , envInterpTable :: !(IORef InterpTable)
}
+type InterpTable = Map String Interpreter
+
+
setupEnv :: FilePath -> PortNumber -> IO Environment
setupEnv lsdir portNum
= do let lucuConf = LC.defaultConfig {
LC.cnfServerPort = PortNumber portNum
}
+ storage = mkStorage
+ sysConf = mkSystemConfig lucuConf
+ interpTable <- mkInterpTable
return $ Environment {
envLocalStateDir = lsdir
, envLucuConf = lucuConf
- , envStorage = mkStorage
- , envSysConf = mkSystemConfig lucuConf
+ , envStorage = storage
+ , envSysConf = sysConf
+ , envInterpTable = interpTable
}
+
+
+mkInterpTable :: IO (IORef InterpTable)
+mkInterpTable = newIORef (listToTable baseInterpreters)
+ where
+ listToTable :: [Interpreter] -> InterpTable
+ listToTable xs
+ = M.fromList [ (commandName x, x) | x <- xs ]
+
+
+getInterpTable :: Environment -> IO InterpTable
+getInterpTable = readIORef . envInterpTable
+
+
+getInterpTableA :: ArrowIO a => Environment -> a b InterpTable
+getInterpTableA = arrIO0 . getInterpTable