{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveGeneric #-}

module Cardano.BM.Stats.Resources
  ( Resources(..)
  , ResourceStats
  , Word64
  )
where

import           Data.Aeson
import           Data.Word
import           GHC.Generics (Generic)

-- | Concrete data provided by 'readResourceStats'.
--   (See platform-specific files in Cardano.BM.Counters)
type ResourceStats = Resources Word64

-- * HKD for resources used by the process.
--
data Resources a
  = Resources
      { Resources a -> a
rCentiCpu   :: !a
      , Resources a -> a
rCentiGC    :: !a
      , Resources a -> a
rCentiMut   :: !a
      , Resources a -> a
rGcsMajor   :: !a
      , Resources a -> a
rGcsMinor   :: !a
      , Resources a -> a
rAlloc      :: !a
      , Resources a -> a
rLive       :: !a
      , Resources a -> a
rRSS        :: !a
      , Resources a -> a
rCentiBlkIO :: !a
      , Resources a -> a
rThreads    :: !a
      }
  deriving (a -> Resources b -> Resources a
(a -> b) -> Resources a -> Resources b
(forall a b. (a -> b) -> Resources a -> Resources b)
-> (forall a b. a -> Resources b -> Resources a)
-> Functor Resources
forall a b. a -> Resources b -> Resources a
forall a b. (a -> b) -> Resources a -> Resources b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> Resources b -> Resources a
$c<$ :: forall a b. a -> Resources b -> Resources a
fmap :: (a -> b) -> Resources a -> Resources b
$cfmap :: forall a b. (a -> b) -> Resources a -> Resources b
Functor, (forall x. Resources a -> Rep (Resources a) x)
-> (forall x. Rep (Resources a) x -> Resources a)
-> Generic (Resources a)
forall x. Rep (Resources a) x -> Resources a
forall x. Resources a -> Rep (Resources a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (Resources a) x -> Resources a
forall a x. Resources a -> Rep (Resources a) x
$cto :: forall a x. Rep (Resources a) x -> Resources a
$cfrom :: forall a x. Resources a -> Rep (Resources a) x
Generic, Int -> Resources a -> ShowS
[Resources a] -> ShowS
Resources a -> String
(Int -> Resources a -> ShowS)
-> (Resources a -> String)
-> ([Resources a] -> ShowS)
-> Show (Resources a)
forall a. Show a => Int -> Resources a -> ShowS
forall a. Show a => [Resources a] -> ShowS
forall a. Show a => Resources a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Resources a] -> ShowS
$cshowList :: forall a. Show a => [Resources a] -> ShowS
show :: Resources a -> String
$cshow :: forall a. Show a => Resources a -> String
showsPrec :: Int -> Resources a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Resources a -> ShowS
Show)

instance Applicative Resources where
  pure :: a -> Resources a
pure a
a = a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> Resources a
forall a.
a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> Resources a
Resources a
a a
a a
a a
a a
a a
a a
a a
a a
a a
a
  Resources (a -> b)
f <*> :: Resources (a -> b) -> Resources a -> Resources b
<*> Resources a
x =
    Resources :: forall a.
a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> Resources a
Resources
    { rCentiCpu :: b
rCentiCpu   = Resources (a -> b) -> a -> b
forall a. Resources a -> a
rCentiCpu   Resources (a -> b)
f (Resources a -> a
forall a. Resources a -> a
rCentiCpu   Resources a
x)
    , rCentiGC :: b
rCentiGC    = Resources (a -> b) -> a -> b
forall a. Resources a -> a
rCentiGC    Resources (a -> b)
f (Resources a -> a
forall a. Resources a -> a
rCentiGC    Resources a
x)
    , rCentiMut :: b
rCentiMut   = Resources (a -> b) -> a -> b
forall a. Resources a -> a
rCentiMut   Resources (a -> b)
f (Resources a -> a
forall a. Resources a -> a
rCentiMut   Resources a
x)
    , rGcsMajor :: b
rGcsMajor   = Resources (a -> b) -> a -> b
forall a. Resources a -> a
rGcsMajor   Resources (a -> b)
f (Resources a -> a
forall a. Resources a -> a
rGcsMajor   Resources a
x)
    , rGcsMinor :: b
rGcsMinor   = Resources (a -> b) -> a -> b
forall a. Resources a -> a
rGcsMinor   Resources (a -> b)
f (Resources a -> a
forall a. Resources a -> a
rGcsMinor   Resources a
x)
    , rAlloc :: b
rAlloc      = Resources (a -> b) -> a -> b
forall a. Resources a -> a
rAlloc      Resources (a -> b)
f (Resources a -> a
forall a. Resources a -> a
rAlloc      Resources a
x)
    , rLive :: b
rLive       = Resources (a -> b) -> a -> b
forall a. Resources a -> a
rLive       Resources (a -> b)
f (Resources a -> a
forall a. Resources a -> a
rLive       Resources a
x)
    , rRSS :: b
rRSS        = Resources (a -> b) -> a -> b
forall a. Resources a -> a
rRSS        Resources (a -> b)
f (Resources a -> a
forall a. Resources a -> a
rRSS        Resources a
x)
    , rCentiBlkIO :: b
rCentiBlkIO = Resources (a -> b) -> a -> b
forall a. Resources a -> a
rCentiBlkIO Resources (a -> b)
f (Resources a -> a
forall a. Resources a -> a
rCentiBlkIO Resources a
x)
    , rThreads :: b
rThreads    = Resources (a -> b) -> a -> b
forall a. Resources a -> a
rThreads    Resources (a -> b)
f (Resources a -> a
forall a. Resources a -> a
rThreads    Resources a
x)
    }

-- * JSON
--
encodingOptions :: Options
encodingOptions :: Options
encodingOptions = Options
defaultOptions
  { fieldLabelModifier :: ShowS
fieldLabelModifier     = Int -> ShowS
forall a. Int -> [a] -> [a]
drop Int
1
  , tagSingleConstructors :: Bool
tagSingleConstructors  = Bool
True
  , sumEncoding :: SumEncoding
sumEncoding =
    SumEncoding
defaultTaggedObject
    { tagFieldName :: String
tagFieldName      = String
"kind"
    }
  }

instance FromJSON a => FromJSON (Resources a) where
  parseJSON :: Value -> Parser (Resources a)
parseJSON = Options -> Value -> Parser (Resources a)
forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON Options
encodingOptions

instance ToJSON a => ToJSON (Resources a) where
  toJSON :: Resources a -> Value
toJSON = Options -> Resources a -> Value
forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON Options
encodingOptions
  toEncoding :: Resources a -> Encoding
toEncoding = Options -> Resources a -> Encoding
forall a.
(Generic a, GToJSON' Encoding Zero (Rep a)) =>
Options -> a -> Encoding
genericToEncoding Options
encodingOptions