2
2
{-# LANGUAGE NamedFieldPuns #-}
3
3
{-# LANGUAGE RankNTypes #-}
4
4
{-# LANGUAGE ScopedTypeVariables #-}
5
+ {-# LANGUAGE TupleSections #-}
5
6
6
7
{-# OPTIONS_GHC -Wno-name-shadowing #-}
7
8
module Control.Monad.IOSim
@@ -58,9 +59,13 @@ module Control.Monad.IOSim
58
59
, selectTraceEvents
59
60
, selectTraceEvents'
60
61
, selectTraceEventsDynamic
62
+ , selectTraceEventsDynamicWithTime
61
63
, selectTraceEventsDynamic'
64
+ , selectTraceEventsDynamicWithTime'
62
65
, selectTraceEventsSay
66
+ , selectTraceEventsSayWithTime
63
67
, selectTraceEventsSay'
68
+ , selectTraceEventsSayWithTime'
64
69
, selectTraceRaces
65
70
-- *** trace selectors
66
71
, traceSelectTraceEvents
@@ -108,7 +113,7 @@ import System.IO.Unsafe
108
113
109
114
110
115
selectTraceEvents
111
- :: (SimEventType -> Maybe b )
116
+ :: (Time -> SimEventType -> Maybe b )
112
117
-> SimTrace a
113
118
-> [b ]
114
119
selectTraceEvents fn =
@@ -124,7 +129,7 @@ selectTraceEvents fn =
124
129
. traceSelectTraceEvents fn
125
130
126
131
selectTraceEvents'
127
- :: (SimEventType -> Maybe b )
132
+ :: (Time -> SimEventType -> Maybe b )
128
133
-> SimTrace a
129
134
-> [b ]
130
135
selectTraceEvents' fn =
@@ -177,19 +182,37 @@ detachTraceRaces trace = unsafePerformIO $ do
177
182
selectTraceEventsDynamic :: forall a b . Typeable b => SimTrace a -> [b ]
178
183
selectTraceEventsDynamic = selectTraceEvents fn
179
184
where
180
- fn :: SimEventType -> Maybe b
181
- fn (EventLog dyn) = fromDynamic dyn
182
- fn _ = Nothing
185
+ fn :: Time -> SimEventType -> Maybe b
186
+ fn _ (EventLog dyn) = fromDynamic dyn
187
+ fn _ _ = Nothing
188
+
189
+ -- | Like 'selectTraceEventsDynamic' but also captures time of the trace event.
190
+ --
191
+ selectTraceEventsDynamicWithTime :: forall a b . Typeable b => SimTrace a -> [(Time , b )]
192
+ selectTraceEventsDynamicWithTime = selectTraceEvents fn
193
+ where
194
+ fn :: Time -> SimEventType -> Maybe (Time , b )
195
+ fn t (EventLog dyn) = (t,) <$> fromDynamic dyn
196
+ fn _ _ = Nothing
183
197
184
198
-- | Like 'selectTraceEventsDynamic' but returns partial trace if an exception
185
199
-- is found in it.
186
200
--
187
201
selectTraceEventsDynamic' :: forall a b . Typeable b => SimTrace a -> [b ]
188
202
selectTraceEventsDynamic' = selectTraceEvents' fn
189
203
where
190
- fn :: SimEventType -> Maybe b
191
- fn (EventLog dyn) = fromDynamic dyn
192
- fn _ = Nothing
204
+ fn :: Time -> SimEventType -> Maybe b
205
+ fn _ (EventLog dyn) = fromDynamic dyn
206
+ fn _ _ = Nothing
207
+
208
+ -- | Like `selectTraceEventsDynamic'` but also captures time of the trace event.
209
+ --
210
+ selectTraceEventsDynamicWithTime' :: forall a b . Typeable b => SimTrace a -> [(Time , b )]
211
+ selectTraceEventsDynamicWithTime' = selectTraceEvents' fn
212
+ where
213
+ fn :: Time -> SimEventType -> Maybe (Time , b )
214
+ fn t (EventLog dyn) = (t,) <$> fromDynamic dyn
215
+ fn _ _ = Nothing
193
216
194
217
-- | Get a trace of 'EventSay'.
195
218
--
@@ -198,19 +221,37 @@ selectTraceEventsDynamic' = selectTraceEvents' fn
198
221
selectTraceEventsSay :: SimTrace a -> [String ]
199
222
selectTraceEventsSay = selectTraceEvents fn
200
223
where
201
- fn :: SimEventType -> Maybe String
202
- fn (EventSay s) = Just s
203
- fn _ = Nothing
224
+ fn :: Time -> SimEventType -> Maybe String
225
+ fn _ (EventSay s) = Just s
226
+ fn _ _ = Nothing
227
+
228
+ -- | Like 'selectTraceEventsSay' but also captures time of the trace event.
229
+ --
230
+ selectTraceEventsSayWithTime :: SimTrace a -> [(Time , String )]
231
+ selectTraceEventsSayWithTime = selectTraceEvents fn
232
+ where
233
+ fn :: Time -> SimEventType -> Maybe (Time , String )
234
+ fn t (EventSay s) = Just (t, s)
235
+ fn _ _ = Nothing
204
236
205
237
-- | Like 'selectTraceEventsSay' but return partial trace if an exception is
206
238
-- found in it.
207
239
--
208
240
selectTraceEventsSay' :: SimTrace a -> [String ]
209
241
selectTraceEventsSay' = selectTraceEvents' fn
210
242
where
211
- fn :: SimEventType -> Maybe String
212
- fn (EventSay s) = Just s
213
- fn _ = Nothing
243
+ fn :: Time -> SimEventType -> Maybe String
244
+ fn _ (EventSay s) = Just s
245
+ fn _ _ = Nothing
246
+
247
+ -- | Like `selectTraceEventsSay'` but also captures time of the trace event.
248
+ --
249
+ selectTraceEventsSayWithTime' :: SimTrace a -> [(Time , String )]
250
+ selectTraceEventsSayWithTime' = selectTraceEvents' fn
251
+ where
252
+ fn :: Time -> SimEventType -> Maybe (Time , String )
253
+ fn t (EventSay s) = Just (t, s)
254
+ fn _ _ = Nothing
214
255
215
256
-- | Print all 'EventSay' to the console.
216
257
--
@@ -223,19 +264,19 @@ printTraceEventsSay = mapM_ print . selectTraceEventsSay
223
264
-- | The most general select function. It is a _total_ function.
224
265
--
225
266
traceSelectTraceEvents
226
- :: (SimEventType -> Maybe b )
267
+ :: (Time -> SimEventType -> Maybe b )
227
268
-> SimTrace a
228
269
-> Trace (SimResult a ) b
229
270
traceSelectTraceEvents fn = bifoldr ( \ v _acc -> Nil v )
230
271
( \ eventCtx acc
231
272
-> case eventCtx of
232
273
SimRacesFound _ -> acc
233
274
SimEvent {} ->
234
- case fn (seType eventCtx) of
275
+ case fn (seTime eventCtx) ( seType eventCtx) of
235
276
Nothing -> acc
236
277
Just b -> Cons b acc
237
278
SimPOREvent {} ->
238
- case fn (seType eventCtx) of
279
+ case fn (seTime eventCtx) ( seType eventCtx) of
239
280
Nothing -> acc
240
281
Just b -> Cons b acc
241
282
)
@@ -247,19 +288,19 @@ traceSelectTraceEventsDynamic :: forall a b. Typeable b
247
288
=> SimTrace a -> Trace (SimResult a ) b
248
289
traceSelectTraceEventsDynamic = traceSelectTraceEvents fn
249
290
where
250
- fn :: SimEventType -> Maybe b
251
- fn (EventLog dyn) = fromDynamic dyn
252
- fn _ = Nothing
291
+ fn :: Time -> SimEventType -> Maybe b
292
+ fn _ (EventLog dyn) = fromDynamic dyn
293
+ fn _ _ = Nothing
253
294
254
295
255
296
-- | Select say events. It is a _total_ function.
256
297
--
257
298
traceSelectTraceEventsSay :: forall a . SimTrace a -> Trace (SimResult a ) String
258
299
traceSelectTraceEventsSay = traceSelectTraceEvents fn
259
300
where
260
- fn :: SimEventType -> Maybe String
261
- fn (EventSay s) = Just s
262
- fn _ = Nothing
301
+ fn :: Time -> SimEventType -> Maybe String
302
+ fn _ (EventSay s) = Just s
303
+ fn _ _ = Nothing
263
304
264
305
-- | Simulation terminated a failure.
265
306
--
0 commit comments