@@ -21,6 +21,7 @@ module Troupe.Process
2121 MonadProcess (.. ),
2222 Process ,
2323 runProcess ,
24+ withProcessEnv ,
2425 self ,
2526 ProcessOption (.. ),
2627 setProcessOption ,
@@ -148,20 +149,18 @@ import Troupe.Types
148149 succProcessId ,
149150 )
150151
151- data NodeContext r = NodeContext
152+ data NodeContext = NodeContext
152153 { nodeContextNextProcessId :: {-# UNPACK #-} ! (TVar ProcessId ),
153154 nodeContextNextMonitorRefId :: {-# UNPACK #-} ! (TVar MonitorRefId ),
154- nodeContextProcesses :: {-# UNPACK #-} ! (Map ProcessId ProcessContext ),
155- nodeContextR :: r
155+ nodeContextProcesses :: {-# UNPACK #-} ! (Map ProcessId ProcessContext )
156156 }
157157
158- newNodeContext :: r -> IO ( NodeContext r )
159- newNodeContext r =
158+ newNodeContext :: IO NodeContext
159+ newNodeContext =
160160 NodeContext
161161 <$> newTVarIO processId0
162162 <*> newTVarIO monitorRefId0
163163 <*> Map. newIO
164- <*> pure r
165164
166165data ProcessContext = ProcessContext
167166 { processContextId :: {-# UNPACK #-} ! ProcessId ,
@@ -173,7 +172,7 @@ data ProcessContext = ProcessContext
173172 processContextMonitorees :: {-# UNPACK #-} ! (Set MonitorRef )
174173 }
175174
176- newProcessContextSTM :: CQueue Dynamic -> ReaderT ( NodeContext r ) STM ProcessContext
175+ newProcessContextSTM :: CQueue Dynamic -> ReaderT NodeContext STM ProcessContext
177176newProcessContextSTM queue = do
178177 pid <- newPid
179178 lift $
@@ -189,15 +188,17 @@ newProcessContextSTM queue = do
189188 writeTVarR nodeContextNextProcessId $!! succProcessId curr
190189 pure curr
191190
192- newProcessContext :: NodeContext r -> IO ProcessContext
191+ newProcessContext :: NodeContext -> IO ProcessContext
193192newProcessContext nodeContext = do
194193 queue <- newCQueue
195194 atomically $ runReaderT (newProcessContextSTM queue) nodeContext
196195
197196data ProcessEnv r = ProcessEnv
198- { processEnvNodeContext :: {-# UNPACK #-} ! (NodeContext r ),
199- processEnvProcessContext :: {-# UNPACK #-} ! ProcessContext
197+ { processEnvNodeContext :: {-# UNPACK #-} ! NodeContext ,
198+ processEnvProcessContext :: {-# UNPACK #-} ! ProcessContext ,
199+ processEnvLocalContext :: ! r
200200 }
201+ deriving stock (Functor )
201202
202203-- | @mtl@-style class to bring 'Process' support to transformers.
203204class (Monad m ) => MonadProcess r m | m -> r where
@@ -273,21 +274,16 @@ instance MonadProcess r (Process r) where
273274 {-# INLINE getProcessEnv #-}
274275
275276instance MonadReader r (Process r ) where
276- ask = Process $ reader (nodeContextR . processEnvNodeContext)
277- 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- }
277+ ask = Process $ reader processEnvLocalContext
278+ reader f = Process $ reader (f . processEnvLocalContext)
279+ local f (Process a) = Process $ local (fmap f) a
287280
288281runProcess :: Process r a -> ProcessEnv r -> IO a
289282runProcess = runReaderT . unProcess
290283
284+ withProcessEnv :: (r -> r' ) -> Process r' a -> Process r a
285+ withProcessEnv f (Process m) = Process $ withReaderT (fmap f) m
286+
291287-- | Get the 'ProcessId' of the running process.
292288self :: (MonadProcess r m ) => m ProcessId
293289self = processContextId . processEnvProcessContext <$> getProcessEnv
@@ -360,7 +356,7 @@ deliverExit !pc !exc = do
360356 Nothing -> pure () -- Process exited without exception
361357 Just _ -> deliverException pc (toException exc')
362358
363- lookupProcess :: ProcessId -> ReaderT ( NodeContext r ) STM (Maybe ProcessContext )
359+ lookupProcess :: ProcessId -> ReaderT NodeContext STM (Maybe ProcessContext )
364360lookupProcess ! pid = reader nodeContextProcesses >>= lift . Map. lookup pid
365361
366362linkSTM :: ProcessId -> ReaderT (ProcessEnv r ) STM ()
0 commit comments