packages feed

monad-effect-0.1.0.0: src/Module/Resource.hs

{-# LANGUAGE RecordWildCards #-}
{-# OPTIONS_GHC -Wno-orphans #-}
-- | Provides ResourceT functionality for managing resources
module Module.Resource where

import Control.Monad.Effect
import Control.Monad.Trans.Resource
import Control.Monad.Trans.Resource.Internal
import Control.System
import Data.Default
import Data.IORef
import GHC.Generics (Generic)

data Resource

instance Module Resource where
  newtype ModuleRead Resource = ResourceRead { resourceRead :: IORef (ReleaseMap) }
  data    ModuleState Resource = ResourceState

instance SystemModule Resource where
  data ModuleInitData Resource = ResourceInitData deriving (Generic, Default)
  data ModuleEvent    Resource = ResourceEvent

-- | Not really orphan because it is EffT'
instance (In' c Resource mods, MonadIO m) => MonadResource (EffT' c mods es m) where
  liftResourceT = \ResourceT{unResourceT} -> do
    rMap <- asksModule resourceRead
    liftIO $ unResourceT rMap

instance Loadable c Resource mods where
  initModule _ = do
    istate <- createInternalState
    return (ResourceRead istate, ResourceState)