Есть, условно говоря, такой код:
main :: IO ()
main = do
conf <- Con.load [Con.Required "service.cfg"]
let subconf = Con.subconfig "lala" conf
listen <- Con.lookupDefault "127.0.0.1" subconf "listen" :: IO String
port <- Con.lookupDefault 4002 subconf "port" :: IO Int
runTCPServer …
ldapURI = "ldap://host/"
ldapUser = "cn=admin"
ldapPWD = "123"
ldapBDN = Just "ou=Org"
ldapAttrs = LDAPAttrList ["param1", "param2"]
ldapExecuteQuery :: ByteString -> String -> IO AnswerEmailCheck
ldapExecuteQuery m qwr = do
conn <- ldapInitialize ldapURI
ldapSimpleBind conn ldapUser ldapPWD
result <- ldapSearch conn ldapBDN LdapScopeSubtree (Just qwr) ldapAttrs False
return $ getRes m result
myConnectionRedis :: ConnectInfo
myConnectionRedis = defaultConnectInfo {connectHost = "127.0.0.1"}
condRedisGet :: MonadIO m => Conduit MailMqouta m ByteString
condRedisGet = awaitForever $ \(mail, mquota) -> do
conn <- liftIO $ Database.Redis.connect myConnectionRedis
result <- liftIO $ runRedis conn $ do
res <- get . createRedisQuery $ mail
case res of
…
Суть проблемы такова: я хочу вынести константы типа myConnectionRedis, ldapURI и прочего во внешний конфиг. То, как оно может быть исполнено, нарисовано в main.
При этом я не пойму, как написать код, чтобы избежать многократного перечитывания конфига при вызовах функций condRedisGet и прочих, где используются данные константы.
Функции же эти вызываются очень часто, на каждый кусок данных.
Возможно, кстати, что мой подход к написанию кода ужасен, тогда прокомментируйте и скажите, что именно не так.
Заранее благодарю за советы.