module Profiling.GHC.Aeson
( CostCentre(..)
, CostCentreStack(..)
, GhcProfile(..)
) where
import qualified Data.Aeson as A (FromJSON(..), genericParseJSON)
import qualified Data.Aeson.Types as A (defaultOptions, fieldLabelModifier)
import Data.List (stripPrefix)
import Data.Maybe (fromMaybe)
import qualified Data.Text as T
import qualified Data.Vector as V
import GHC.Generics (Generic)
dropFieldPrefix
:: String
-> String
-> String
dropFieldPrefix pref fld = fromMaybe fld $ Data.List.stripPrefix pref fld
data CostCentre = CostCentre
{ _cc_id :: !Int
, _cc_label :: !T.Text
, _cc_module :: !T.Text
, _cc_src_loc :: !T.Text
, _cc_is_caf :: !Bool
} deriving (Show, Eq, Ord, Generic)
instance A.FromJSON CostCentre where
parseJSON = A.genericParseJSON A.defaultOptions
{ A.fieldLabelModifier = dropFieldPrefix "_cc_" }
data CostCentreStack = CostCentreStack
{ _ccs_id :: !Int
, _ccs_entries :: !Int
, _ccs_alloc :: !Int
, _ccs_ticks :: !Int
, _ccs_children :: !(V.Vector CostCentreStack)
} deriving (Show, Eq, Ord, Generic)
instance A.FromJSON CostCentreStack where
parseJSON = A.genericParseJSON A.defaultOptions
{ A.fieldLabelModifier = dropFieldPrefix "_ccs_" }
data GhcProfile = GhcProfile
{ _gp_program :: !T.Text
, _gp_arguments :: !(V.Vector T.Text)
, _gp_rts_arguments :: !(V.Vector T.Text)
, _gp_end_time :: !T.Text
, _gp_initial_capabilities :: !Int
, _gp_total_time :: !Double
, _gp_total_ticks :: !Int
, _gp_tick_interval :: !Int
, _gp_total_alloc :: !Int
, _gp_cost_centres :: !(V.Vector CostCentre)
, _gp_profile :: !CostCentreStack
} deriving (Show, Eq, Ord, Generic)
instance A.FromJSON GhcProfile where
parseJSON = A.genericParseJSON A.defaultOptions
{ A.fieldLabelModifier = dropFieldPrefix "_gp_" }