Skip to content

Commit 8ab0b94

Browse files
committed
Move custom bit of Process into ProcessEnv
Adds withProcessEnv (like withReaderT) - a more general `local` for MonadReader r (Process r).
1 parent 639dcb3 commit 8ab0b94

File tree

2 files changed

+22
-24
lines changed

2 files changed

+22
-24
lines changed

troupe/src/Troupe.hs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ module Troupe
6868

6969
-- * @mtl@-style transformer support
7070
MonadProcess (..),
71+
withProcessEnv
7172
)
7273
where
7374

@@ -94,6 +95,7 @@ import Troupe.Process
9495
( DemonitorOption (..),
9596
Match,
9697
MonadProcess (..),
98+
withProcessEnv,
9799
NodeContext (..),
98100
Process,
99101
ProcessEnv (..),
@@ -132,9 +134,9 @@ import Troupe.Types (Down (..), MonitorRef, ProcessId)
132134
-- doesn't necessarily return when @p@ returns.
133135
runNode :: r -> Process r a -> IO ()
134136
runNode r process = do
135-
nodeContext <- newNodeContext r
137+
nodeContext <- newNodeContext
136138
processContext <- newProcessContext nodeContext
137-
let processEnv = ProcessEnv nodeContext processContext
139+
let processEnv = ProcessEnv nodeContext processContext r
138140

139141
_ <- runProcess (spawn process) processEnv
140142

troupe/src/Troupe/Process.hs

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

166165
data 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
177176
newProcessContextSTM 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
193192
newProcessContext nodeContext = do
194193
queue <- newCQueue
195194
atomically $ runReaderT (newProcessContextSTM queue) nodeContext
196195

197196
data 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.
203204
class (Monad m) => MonadProcess r m | m -> r where
@@ -273,21 +274,16 @@ instance MonadProcess r (Process r) where
273274
{-# INLINE getProcessEnv #-}
274275

275276
instance 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

288281
runProcess :: Process r a -> ProcessEnv r -> IO a
289282
runProcess = 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.
292288
self :: (MonadProcess r m) => m ProcessId
293289
self = 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)
364360
lookupProcess !pid = reader nodeContextProcesses >>= lift . Map.lookup pid
365361

366362
linkSTM :: ProcessId -> ReaderT (ProcessEnv r) STM ()

0 commit comments

Comments
 (0)