nakadi-client-0.6.0.0: src/Network/Nakadi/Internal/Unsafe/IO.hs
{-|
Module : Network.Nakadi.Unsafe.IO
Description : Support for MonadNakadi IO Instance
Copyright : (c) Moritz Clasmeier 2018
License : BSD3
Maintainer : mtesseract@silverratio.net
Stability : experimental
Portability : POSIX
Nakadi-client provides a 'MonadNakadi' instance for the 'IO' monad
accessing a global mutable configuration.
This module implements the functionality for managing this global
configuration.
-}
{-# LANGUAGE MultiParamTypeClasses #-}
module Network.Nakadi.Internal.Unsafe.IO where
import UnliftIO.STM
import Network.Nakadi.Internal.Types
import Network.Nakadi.Internal.Prelude
import Network.Nakadi.Internal.Config
import Network.Nakadi.Internal.GlobalConfig
-- | Initialize the global configuration used by the 'MonadNakadi' instance
-- for the 'IO' monad via 'newConfigFromEnv'.
--
-- Experimental API.
initializeGlobalConfigurationFromEnv :: (MonadIO m, MonadThrow m) => m ()
initializeGlobalConfigurationFromEnv = do
config <- newConfigFromEnv
atomically $ writeTVar globalConfiguration (Just config)
-- | Sets the global configuration used by the 'MonadNakadi' instance
-- for the 'IO' monad to the provided configuration.
--
-- Experimental API.
setGlobalConfiguration :: MonadIO m => ConfigIO -> m ()
setGlobalConfiguration = atomically . writeTVar globalConfiguration . Just
-- | Modifies the global configuration used by the 'MonadNakadi' instance
-- for the 'IO' monad using the provided function. If no global configuration has
-- been set so far (using 'initializeGlobalConfigurationFromEnv' or
-- 'setGlobalConfiguration'), this will throw a 'ConfigurationMissing' exception.
--
-- Experimental API.
modifyGlobalConfiguration :: MonadIO m => (ConfigIO -> ConfigIO) -> m ()
modifyGlobalConfiguration f = atomically $ modifyTVar' globalConfiguration (fmap f)