-- | The detail is the name of an `Aspect` seprate from its data.
module BuildBox.Data.Detail
        ( Detail (..)
        , Timed  (..)
        , Used   (..)
        , Sized  (..))
where
import BuildBox.Pretty

data Detail
        = DetailTimed Timed
        | DetailUsed   Used
        | DetailSized  Sized
        deriving (Eq, Ord, Show, Read)
        

-- | Something that takes time to evaluate.
data Timed
        = TotalWall
        | TotalCpu
        | TotalSys
        | KernelWall
        | KernelCpu 
        | KernelSys
        deriving (Eq, Ord, Show, Read, Enum)
        
instance Pretty Timed where
 ppr timed
  = case timed of
        TotalWall       -> text "runtime        (wall clock)"
        TotalCpu        -> text "runtime        (cpu usage)"
        TotalSys        -> text "runtime        (sys usage)"

        KernelWall      -> text "kernel runtime (wall clock)"
        KernelCpu       -> text "kernel runtime (cpu usage)"
        KernelSys       -> text "kernel runtime (sys usage)"
                

-- | Some resource used during execution.
data Used
        = HeapMax
        | HeapAlloc
        deriving (Eq, Ord, Show, Read, Enum)
        
instance Pretty Used where
 ppr used
  = case used of
        HeapMax         -> text "maximum heap usage"
        HeapAlloc       -> text "heap allocation"
        
        
-- | Some static size of the benchmark that isn't affected during the run.
data Sized
        = ExeSize
        deriving (Eq, Ord, Show, Read, Enum)
        
instance Pretty Sized where
 ppr sized
  = case sized of
        ExeSize         -> text "executable size"