{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
module Types where
import qualified Data.Text as T
import Data.Int
import Data.Tree
import qualified Data.IntMap as IM
import qualified Data.IntSet as IS
import Data.Scientific
-- import Data.Typeable
import Data.GI.Base.GValue
type Id = Int
class IsTree t a | t -> a where
treeRoot :: t -> a
treeChildren :: t -> [t]
data AggregateState = Individual | Aggregated
deriving (Eq, Show)
data RecordId (a :: AggregateState) where
IndividualId :: Id -> RecordId Individual
AggregatedId :: IS.IntSet -> RecordId Aggregated
instance Show (RecordId a) where
show (IndividualId id) = show id
show (AggregatedId set) = show set
instance IsGValue Int where
toGValue x = toGValue (fromIntegral x :: Int64)
fromGValue v = fromIntegral `fmap` (fromGValue v :: IO Int64)
instance IsGValue Integer where
toGValue x = toGValue (fromIntegral x :: Int64)
fromGValue v = fromIntegral `fmap` (fromGValue v :: IO Int64)
instance IsGValue Scientific where
toGValue x = toGValue (toRealFloat x :: Double)
fromGValue v = fromFloatDigits `fmap` (fromGValue v :: IO Double)
data CostCentreData = CostCentreData {
ccdProfile :: ! Profile
, ccdParent :: Maybe CostCentreData
, ccdRecords :: ! [ProfileRecord Individual]
, ccdCostCentre :: ! CostCentre
, ccdChildren :: ! [CostCentreData]
}
deriving (Show)
instance IsTree CostCentreData CostCentreData where
treeRoot = id
treeChildren = ccdChildren
data CostCentre = CostCentre {
ccLabel :: ! T.Text
, ccId :: ! Id
, ccModule :: ! T.Text
, ccSource :: ! T.Text
, ccIsCaf :: ! Bool
}
deriving (Eq, Show)
data ProfileRecord s = ProfileRecord {
prCcId :: ! (RecordId s)
, prEntries :: ! Integer
, prTicks :: ! (Maybe Integer) -- ^ If present in input file
, prAlloc :: ! (Maybe Integer) -- ^ If present in input file
, prTimeIndividual :: ! (Maybe Double) -- ^ If present in input file
, prAllocIndividual :: ! (Maybe Double) -- ^ If present in input file
, prTimeInherited :: ! (Maybe Double) -- ^ If present in input file
, prAllocInherited :: ! (Maybe Double) -- ^ If present in input file
}
deriving (Show)
singleRecordId :: ProfileRecord Individual -> Id
singleRecordId r@(ProfileRecord {prCcId = IndividualId id}) = id
listRecordId :: ProfileRecord a -> [Id]
listRecordId (ProfileRecord {prCcId = IndividualId id}) = [id]
listRecordId (ProfileRecord {prCcId = AggregatedId set}) = IS.toList set
data Profile = Profile {
profileProgram :: ! T.Text
, profileTotalTime :: ! Double
, profileRtsArguments :: ! [T.Text]
, profileInitCaps :: ! Int32
, profileTickInterval :: ! Int32
, profileTotalAlloc :: ! Integer
, profileTotalTicks :: ! Integer
, profileTree :: Tree (ProfileRecord Individual)
, profileTreeMap :: IM.IntMap (Tree (ProfileRecord Individual))
, profileCostCentres :: IM.IntMap CostCentre
}
deriving (Show)
data FilterParams = FilterParams {
fpEntries :: Integer
, fpTimeIndividual :: Double
, fpAllocIndividual :: Double
, fpTimeInherited :: Double
, fpAllocInherited :: Double
, fpModule :: T.Text
, fpSource :: T.Text
}
data SearchMetohd = Contains | Exact | Regexp
deriving (Eq, Show, Read, Enum, Bounded)