@@ -21,6 +21,7 @@ module Troupe.Process
2121 MonadProcess (.. ),
2222 Process ,
2323 runProcess ,
24+ withProcess ,
2425 self ,
2526 ProcessOption (.. ),
2627 setProcessOption ,
@@ -154,6 +155,7 @@ data NodeContext r = NodeContext
154155 nodeContextProcesses :: {-# UNPACK #-} ! (Map ProcessId ProcessContext ),
155156 nodeContextR :: r
156157 }
158+ deriving stock (Functor )
157159
158160newNodeContext :: r -> IO (NodeContext r )
159161newNodeContext r =
@@ -198,6 +200,7 @@ data ProcessEnv r = ProcessEnv
198200 { processEnvNodeContext :: {-# UNPACK #-} ! (NodeContext r ),
199201 processEnvProcessContext :: {-# UNPACK #-} ! ProcessContext
200202 }
203+ deriving stock (Functor )
201204
202205-- | @mtl@-style class to bring 'Process' support to transformers.
203206class (Monad m ) => MonadProcess r m | m -> r where
@@ -275,19 +278,14 @@ instance MonadProcess r (Process r) where
275278instance MonadReader r (Process r ) where
276279 ask = Process $ reader (nodeContextR . processEnvNodeContext)
277280 reader f = Process $ reader (f . nodeContextR . processEnvNodeContext)
278- local f (Process a) = Process $ local mapR a
279- where
280- mapR env =
281- env
282- { processEnvNodeContext =
283- (processEnvNodeContext env)
284- { nodeContextR = f (nodeContextR (processEnvNodeContext env))
285- }
286- }
281+ local f (Process a) = Process $ local (fmap f) a
287282
288283runProcess :: Process r a -> ProcessEnv r -> IO a
289284runProcess = runReaderT . unProcess
290285
286+ withProcess :: (r -> r' ) -> Process r' a -> Process r a
287+ withProcess f (Process m) = Process $ withReaderT (fmap f) m
288+
291289-- | Get the 'ProcessId' of the running process.
292290self :: (MonadProcess r m ) => m ProcessId
293291self = processContextId . processEnvProcessContext <$> getProcessEnv
0 commit comments