module Events.HECs (
HECs(..),
Event,
CapEvent,
Timestamp,
eventIndexToTimestamp,
timestampToEventIndex,
extractUserMessages,
) where
import Events.EventTree
import Events.SparkTree
import GHC.RTS.Events
import Data.Array
-----------------------------------------------------------------------------
-- all the data from a .eventlog file
data HECs = HECs {
hecCount :: Int,
hecTrees :: [(DurationTree, EventTree, SparkTree)],
hecEventArray :: Array Int CapEvent,
hecLastEventTime :: Timestamp,
maxSparkValue :: Double,
maxSparkPool :: Double
}
-----------------------------------------------------------------------------
eventIndexToTimestamp :: HECs -> Int -> Timestamp
eventIndexToTimestamp HECs{hecEventArray=arr} n =
time (ce_event (arr ! n))
timestampToEventIndex :: HECs -> Timestamp -> Int
timestampToEventIndex HECs{hecEventArray=arr} ts =
search l (r+1)
where
(l,r) = bounds arr
search !l !r
| (r - l) <= 1 = if ts > time (ce_event (arr!l)) then r else l
| ts < tmid = search l mid
| otherwise = search mid r
where
mid = l + (r - l) `quot` 2
tmid = time (ce_event (arr!mid))
extractUserMessages :: HECs -> [(Timestamp, String)]
extractUserMessages hecs =
[ (ts, msg)
| CapEvent _ (Event ts (UserMessage msg)) <- elems (hecEventArray hecs) ]