Skip to content

Commit f301e8c

Browse files
committed
Add withProcess
A more general `local` for MonadReader r (Process r).
1 parent 639dcb3 commit f301e8c

File tree

1 file changed

+7
-9
lines changed

1 file changed

+7
-9
lines changed

troupe/src/Troupe/Process.hs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

158160
newNodeContext :: r -> IO (NodeContext r)
159161
newNodeContext 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.
203206
class (Monad m) => MonadProcess r m | m -> r where
@@ -275,19 +278,14 @@ instance MonadProcess r (Process r) where
275278
instance 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

288283
runProcess :: Process r a -> ProcessEnv r -> IO a
289284
runProcess = 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.
292290
self :: (MonadProcess r m) => m ProcessId
293291
self = processContextId . processEnvProcessContext <$> getProcessEnv

0 commit comments

Comments
 (0)