Skip to content

Commit 7cc199a

Browse files
authored
Merge pull request #107 from input-output-hk/coot/selectors-with-time
io-sim: selector functions which capture time
2 parents 627e306 + c465be8 commit 7cc199a

File tree

2 files changed

+73
-23
lines changed

2 files changed

+73
-23
lines changed

io-sim/CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,15 @@
22

33
## next version
44

5+
### Breaking changes
6+
7+
* `selectTraceEvents`, `selectTraceEvents'` catpure time of events.
8+
* Added select function which capture the time of the trace events:
9+
- `selectTraceEventsDynamicWithTime`
10+
- `selectTraceEventsDynamicWithTime'`
11+
- `selectTraceEventsSayWithTime`
12+
- `selectTraceEventsSayWithTime'`
13+
514
### Non breaking changes
615

716
* Provide `MonadInspectMVar` instance for `IOSim`.

io-sim/src/Control/Monad/IOSim.hs

Lines changed: 64 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
{-# LANGUAGE NamedFieldPuns #-}
33
{-# LANGUAGE RankNTypes #-}
44
{-# LANGUAGE ScopedTypeVariables #-}
5+
{-# LANGUAGE TupleSections #-}
56

67
{-# OPTIONS_GHC -Wno-name-shadowing #-}
78
module Control.Monad.IOSim
@@ -58,9 +59,13 @@ module Control.Monad.IOSim
5859
, selectTraceEvents
5960
, selectTraceEvents'
6061
, selectTraceEventsDynamic
62+
, selectTraceEventsDynamicWithTime
6163
, selectTraceEventsDynamic'
64+
, selectTraceEventsDynamicWithTime'
6265
, selectTraceEventsSay
66+
, selectTraceEventsSayWithTime
6367
, selectTraceEventsSay'
68+
, selectTraceEventsSayWithTime'
6469
, selectTraceRaces
6570
-- *** trace selectors
6671
, traceSelectTraceEvents
@@ -108,7 +113,7 @@ import System.IO.Unsafe
108113

109114

110115
selectTraceEvents
111-
:: (SimEventType -> Maybe b)
116+
:: (Time -> SimEventType -> Maybe b)
112117
-> SimTrace a
113118
-> [b]
114119
selectTraceEvents fn =
@@ -124,7 +129,7 @@ selectTraceEvents fn =
124129
. traceSelectTraceEvents fn
125130

126131
selectTraceEvents'
127-
:: (SimEventType -> Maybe b)
132+
:: (Time -> SimEventType -> Maybe b)
128133
-> SimTrace a
129134
-> [b]
130135
selectTraceEvents' fn =
@@ -177,19 +182,37 @@ detachTraceRaces trace = unsafePerformIO $ do
177182
selectTraceEventsDynamic :: forall a b. Typeable b => SimTrace a -> [b]
178183
selectTraceEventsDynamic = selectTraceEvents fn
179184
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
183197

184198
-- | Like 'selectTraceEventsDynamic' but returns partial trace if an exception
185199
-- is found in it.
186200
--
187201
selectTraceEventsDynamic' :: forall a b. Typeable b => SimTrace a -> [b]
188202
selectTraceEventsDynamic' = selectTraceEvents' fn
189203
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
193216

194217
-- | Get a trace of 'EventSay'.
195218
--
@@ -198,19 +221,37 @@ selectTraceEventsDynamic' = selectTraceEvents' fn
198221
selectTraceEventsSay :: SimTrace a -> [String]
199222
selectTraceEventsSay = selectTraceEvents fn
200223
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
204236

205237
-- | Like 'selectTraceEventsSay' but return partial trace if an exception is
206238
-- found in it.
207239
--
208240
selectTraceEventsSay' :: SimTrace a -> [String]
209241
selectTraceEventsSay' = selectTraceEvents' fn
210242
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
214255

215256
-- | Print all 'EventSay' to the console.
216257
--
@@ -223,19 +264,19 @@ printTraceEventsSay = mapM_ print . selectTraceEventsSay
223264
-- | The most general select function. It is a _total_ function.
224265
--
225266
traceSelectTraceEvents
226-
:: (SimEventType -> Maybe b)
267+
:: (Time -> SimEventType -> Maybe b)
227268
-> SimTrace a
228269
-> Trace (SimResult a) b
229270
traceSelectTraceEvents fn = bifoldr ( \ v _acc -> Nil v )
230271
( \ eventCtx acc
231272
-> case eventCtx of
232273
SimRacesFound _ -> acc
233274
SimEvent{} ->
234-
case fn (seType eventCtx) of
275+
case fn (seTime eventCtx) (seType eventCtx) of
235276
Nothing -> acc
236277
Just b -> Cons b acc
237278
SimPOREvent{} ->
238-
case fn (seType eventCtx) of
279+
case fn (seTime eventCtx) (seType eventCtx) of
239280
Nothing -> acc
240281
Just b -> Cons b acc
241282
)
@@ -247,19 +288,19 @@ traceSelectTraceEventsDynamic :: forall a b. Typeable b
247288
=> SimTrace a -> Trace (SimResult a) b
248289
traceSelectTraceEventsDynamic = traceSelectTraceEvents fn
249290
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
253294

254295

255296
-- | Select say events. It is a _total_ function.
256297
--
257298
traceSelectTraceEventsSay :: forall a. SimTrace a -> Trace (SimResult a) String
258299
traceSelectTraceEventsSay = traceSelectTraceEvents fn
259300
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
263304

264305
-- | Simulation terminated a failure.
265306
--

0 commit comments

Comments
 (0)