module Network.CloudSeeder.Monads.Environment ( MonadEnvironment(..) ) where import Prelude hiding (readFile) import Control.Monad.Except (ExceptT) import Control.Monad.Logger (LoggingT) import Control.Monad.Reader (ReaderT) import Control.Monad.State (StateT) import Control.Monad.Trans (MonadTrans, lift) import Control.Monad.Writer (WriterT) import qualified Data.Text as T import qualified System.Environment as IO -- | A class of monads that can access environment variables class Monad m => MonadEnvironment m where getEnv :: T.Text -> m (Maybe T.Text) default getEnv :: (MonadTrans t, MonadEnvironment m', m ~ t m') => T.Text -> m (Maybe T.Text) getEnv = lift . getEnv instance MonadEnvironment IO where getEnv = fmap (fmap T.pack) . IO.lookupEnv . T.unpack instance MonadEnvironment m => MonadEnvironment (ExceptT e m) instance MonadEnvironment m => MonadEnvironment (LoggingT m) instance MonadEnvironment m => MonadEnvironment (ReaderT r m) instance MonadEnvironment m => MonadEnvironment (StateT s m) instance (MonadEnvironment m, Monoid w) => MonadEnvironment (WriterT w m)