rio-orphans-0.1.0.0: src/RIO/Orphans.hs
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
-- | Orphan instances for the 'RIO' data type.
module RIO.Orphans
( HasResourceMap (..)
, ResourceMap
, withResourceMap
) where
import RIO
import Control.Monad.Catch (MonadCatch, MonadMask)
import Control.Monad.Base (MonadBase)
import Control.Monad.Trans.Resource.Internal (MonadResource (..), ReleaseMap, ResourceT (..))
import Control.Monad.Trans.Resource (runResourceT)
import Control.Monad.Trans.Control (MonadBaseControl (..))
-- | @since 0.1.0.0
deriving instance MonadCatch (RIO env)
-- | @since 0.1.0.0
deriving instance MonadMask (RIO env)
-- | @since 0.1.0.0
deriving instance MonadBase IO (RIO env)
-- | @since 0.1.0.0
instance MonadBaseControl IO (RIO env) where
type StM (RIO env) a = a
liftBaseWith = withRunInIO
restoreM = return
-- | A collection of all of the registered resource cleanup actions.
--
-- @since 0.1.0.0
type ResourceMap = IORef ReleaseMap
-- | Perform an action with a 'ResourceMap'
--
-- @since 0.1.0.0
withResourceMap :: MonadUnliftIO m => (ResourceMap -> m a) -> m a
withResourceMap inner =
withRunInIO $ \run -> runResourceT $ ResourceT $ run . inner
-- | An environment with a 'ResourceMap'
--
-- @since 0.1.0.0
class HasResourceMap env where
resourceMapL :: Lens' env ResourceMap
instance HasResourceMap (IORef ReleaseMap) where
resourceMapL = id
instance HasResourceMap env => MonadResource (RIO env) where
liftResourceT (ResourceT f) = view resourceMapL >>= liftIO . f