1{-# LANGUAGE UndecidableInstances #-}
2{-# OPTIONS_GHC -Wno-orphans #-}
3-- | Resource management via 'R.MonadResource'.
4module Effectful.Resource
8 -- * Registering and releasing resources
16import Control.Exception
17import qualified Control.Monad.Trans.Resource as R
18import qualified Control.Monad.Trans.Resource.Internal as RI
20import Effectful.Internal.Env
21import Effectful.Internal.Has
22import Effectful.Internal.Monad
24-- | Data tag for a resource effect.
25newtype Resource = Resource R.InternalState
27-- | Run the resource effect.
28runResource :: Eff (Resource : es) a -> Eff es a
29runResource (Eff m) = impureEff $ \es0 -> do
31 istate <- R.createInternalState
33 es <- unsafeConsEnv (Resource istate) es0
34 a <- restore (m es) `catch` \e -> do
35 _ <- unsafeTrimEnv size0 es
36 RI.stateCleanupChecked (Just e) istate
38 _ <- unsafeTrimEnv size0 es
39 RI.stateCleanupChecked Nothing istate
42instance (IOE :> es, Resource :> es) => R.MonadResource (Eff es) where
43 liftResourceT (RI.ResourceT m) = impureEff $ \es -> do
44 getEnv es >>= \(Resource istate) -> m istate
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list