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 { envLocalStateDir :: !FilePath , 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 = 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