module Futhark.Profile.EventSummary (EvSummary (..), eventSummaries) where

import Data.Map qualified as M (Map, fromListWith)
import Data.Text qualified as T (Text)
import Futhark.Profile (ProfilingEvent (ProfilingEvent))

data EvSummary = EvSummary
  { EvSummary -> Integer
evCount :: Integer,
    EvSummary -> Double
evSum :: Double,
    EvSummary -> Double
evMin :: Double,
    EvSummary -> Double
evMax :: Double
  }
  deriving (Int -> EvSummary -> ShowS
[EvSummary] -> ShowS
EvSummary -> String
(Int -> EvSummary -> ShowS)
-> (EvSummary -> String)
-> ([EvSummary] -> ShowS)
-> Show EvSummary
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> EvSummary -> ShowS
showsPrec :: Int -> EvSummary -> ShowS
$cshow :: EvSummary -> String
show :: EvSummary -> String
$cshowList :: [EvSummary] -> ShowS
showList :: [EvSummary] -> ShowS
Show)

eventSummaries :: [ProfilingEvent] -> M.Map (T.Text, T.Text) EvSummary
eventSummaries :: [ProfilingEvent] -> Map (Text, Text) EvSummary
eventSummaries = (EvSummary -> EvSummary -> EvSummary)
-> [((Text, Text), EvSummary)] -> Map (Text, Text) EvSummary
forall k a. Ord k => (a -> a -> a) -> [(k, a)] -> Map k a
M.fromListWith EvSummary -> EvSummary -> EvSummary
comb ([((Text, Text), EvSummary)] -> Map (Text, Text) EvSummary)
-> ([ProfilingEvent] -> [((Text, Text), EvSummary)])
-> [ProfilingEvent]
-> Map (Text, Text) EvSummary
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ProfilingEvent -> ((Text, Text), EvSummary))
-> [ProfilingEvent] -> [((Text, Text), EvSummary)]
forall a b. (a -> b) -> [a] -> [b]
map ProfilingEvent -> ((Text, Text), EvSummary)
pair
  where
    pair :: ProfilingEvent -> ((Text, Text), EvSummary)
pair (ProfilingEvent Text
name Double
dur Text
provenance Value
_details) =
      ((Text
name, Text
provenance), Integer -> Double -> Double -> Double -> EvSummary
EvSummary Integer
1 Double
dur Double
dur Double
dur)
    comb :: EvSummary -> EvSummary -> EvSummary
comb (EvSummary Integer
xn Double
xdur Double
xmin Double
xmax) (EvSummary Integer
yn Double
ydur Double
ymin Double
ymax) =
      Integer -> Double -> Double -> Double -> EvSummary
EvSummary (Integer
xn Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
yn) (Double
xdur Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
ydur) (Double -> Double -> Double
forall a. Ord a => a -> a -> a
min Double
xmin Double
ymin) (Double -> Double -> Double
forall a. Ord a => a -> a -> a
max Double
xmax Double
ymax)