on master help sign in
Added some more instances for Eff (#21)
641a85fMann mit Hut
src/Effectful/Internal/Monad.hs+22
@@ -23,6 +23,10 @@ module Effectful.Internal.Monad
23 , IOE
23 , IOE
24 , runIOE
24 , runIOE
25
25
26+ -- * Primitive
27+ , PrimE
28+ , runPrimE
29+
26 -- ** Unlift strategies
30 -- ** Unlift strategies
27 , UnliftStrategy(..)
31 , UnliftStrategy(..)
28 , Persistence(..)
32 , Persistence(..)
@@ -57,9 +61,11 @@ import Control.Monad.Base
57import Control.Monad.Fix
61import Control.Monad.Fix
58import Control.Monad.IO.Class
62import Control.Monad.IO.Class
59import Control.Monad.IO.Unlift
63import Control.Monad.IO.Unlift
64+import Control.Monad.Primitive
60import Control.Monad.Trans.Control
65import Control.Monad.Trans.Control
61import Data.Unique
66import Data.Unique
62import GHC.Exts (oneShot)
67import GHC.Exts (oneShot)
68+import GHC.IO (IO(..))
63import System.IO.Unsafe (unsafeDupablePerformIO)
69import System.IO.Unsafe (unsafeDupablePerformIO)
64import qualified Control.Monad.Catch as E
70import qualified Control.Monad.Catch as E
65
71
@@ -95,6 +101,7 @@ type role Eff nominal representational
95-- perform other effects, and it also allows the effects to be handled in any
101-- perform other effects, and it also allows the effects to be handled in any
96-- order.
102-- order.
97newtype Eff (es :: [Effect]) a = Eff (Env es -> IO a)
103newtype Eff (es :: [Effect]) a = Eff (Env es -> IO a)
104+ deriving (Monoid, Semigroup)
98
105
99-- | Run a pure 'Eff' operation.
106-- | Run a pure 'Eff' operation.
100--
107--
@@ -272,6 +279,21 @@ instance IOE :> es => MonadBaseControl IO (Eff es) where
272instance IOE :> es => MonadUnliftIO (Eff es) where
279instance IOE :> es => MonadUnliftIO (Eff es) where
273 withRunInIO = unliftEff
280 withRunInIO = unliftEff
274
281
282+----------------------------------------
283+-- Primitive
284+
285+-- | An effect to perform primitive state-transformer actions.
286+data PrimE :: Effect where
287+ PrimE :: PrimE m r
288+
289+-- | Run an 'Eff' operation with primitive state-transformer actions.
290+runPrimE :: IOE :> es => Eff (PrimE : es) a -> Eff es a
291+runPrimE = evalEffect (IdE PrimE)
292+
293+instance PrimE :> es => PrimMonad (Eff es) where
294+ type PrimState (Eff es) = PrimState IO
295+ primitive = unsafeEff_ . IO
296+
275----------------------------------------
297----------------------------------------
276-- Unlift strategies
298-- Unlift strategies
277
299