]> gitweb @ CieloNegro.org - Rakka.git/blobdiff - Rakka/Environment.hs
Implemented more features
[Rakka.git] / Rakka / Environment.hs
index 015d37d43fda667574f42886fd7b9c2b8a3a4180..d68892b61590336f7e78c22f6dc5836cb35a5f63 100644 (file)
@@ -1,13 +1,22 @@
 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 {
@@ -15,17 +24,41 @@ 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