packages feed

groot-0.0.1.0: src/Groot/Core/Common.hs

{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}

module Groot.Core.Common where

import           Control.Monad.Catch
import           Control.Monad.Reader
import           Control.Monad.Trans.Identity (IdentityT)
import           Control.Monad.Trans.Maybe    (MaybeT)
import           Control.Monad.Trans.Resource
import           Control.Monad.Trans.State    (StateT)
import           Network.AWS

type GrootM = ReaderT Env
type GrootAWS = GrootM AWS
type GrootIO = GrootM IO

awsToGrootM :: (MonadResource m, MonadBaseControl IO m) => AWS a -> GrootM m a
awsToGrootM act = do
  env <- ask
  runAWS env act

awsToGrootM_ :: (MonadResource m, MonadBaseControl IO m) => AWS a -> GrootM m ()
awsToGrootM_ aws = (\_ -> pure ()) =<< awsToGrootM aws

runGroot :: (MonadBaseControl IO m, MonadIO m) => GrootM m a -> Env -> m a
runGroot = runReaderT
{-# INLINE runGroot #-}

mapGrootM :: (m a -> n b) -> GrootM m a -> GrootM n b
mapGrootM = mapReaderT
{-# INLINE mapGrootM #-}

class (MonadBaseControl n m, MonadIO m, MonadCatch m, MonadReader Env m) => MonadGroot n m where
  liftGroot :: GrootM n a -> m a

instance MonadGroot IO GrootIO where
  liftGroot = id

instance MonadGroot n m => MonadGroot n (IdentityT   m) where liftGroot = lift . liftGroot
instance MonadGroot n m => MonadGroot n (MaybeT      m) where liftGroot = lift . liftGroot
instance MonadGroot n m => MonadGroot n (ReaderT Env m) where liftGroot = lift . liftGroot
instance MonadGroot n m => MonadGroot n (ResourceT   m) where liftGroot = lift . liftGroot
instance MonadGroot n m => MonadGroot n (StateT    s m) where liftGroot = lift . liftGroot