{-# LANGUAGE OverloadedStrings #-}

module Data.Memoization.Metrics (
    CacheMetrics(..)
  ) where


import qualified Data.Text as Text

import Data.Text.Extended.Pretty

----------------------------------------------------------

data CacheMetrics = CacheMetrics { CacheMetrics -> Int
queryCount :: {-# UNPACK #-} !Int
                                 , CacheMetrics -> Int
missCount  :: {-# UNPACK #-} !Int
                                 }
  deriving ( CacheMetrics -> CacheMetrics -> Bool
(CacheMetrics -> CacheMetrics -> Bool)
-> (CacheMetrics -> CacheMetrics -> Bool) -> Eq CacheMetrics
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CacheMetrics -> CacheMetrics -> Bool
$c/= :: CacheMetrics -> CacheMetrics -> Bool
== :: CacheMetrics -> CacheMetrics -> Bool
$c== :: CacheMetrics -> CacheMetrics -> Bool
Eq, Eq CacheMetrics
Eq CacheMetrics
-> (CacheMetrics -> CacheMetrics -> Ordering)
-> (CacheMetrics -> CacheMetrics -> Bool)
-> (CacheMetrics -> CacheMetrics -> Bool)
-> (CacheMetrics -> CacheMetrics -> Bool)
-> (CacheMetrics -> CacheMetrics -> Bool)
-> (CacheMetrics -> CacheMetrics -> CacheMetrics)
-> (CacheMetrics -> CacheMetrics -> CacheMetrics)
-> Ord CacheMetrics
CacheMetrics -> CacheMetrics -> Bool
CacheMetrics -> CacheMetrics -> Ordering
CacheMetrics -> CacheMetrics -> CacheMetrics
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: CacheMetrics -> CacheMetrics -> CacheMetrics
$cmin :: CacheMetrics -> CacheMetrics -> CacheMetrics
max :: CacheMetrics -> CacheMetrics -> CacheMetrics
$cmax :: CacheMetrics -> CacheMetrics -> CacheMetrics
>= :: CacheMetrics -> CacheMetrics -> Bool
$c>= :: CacheMetrics -> CacheMetrics -> Bool
> :: CacheMetrics -> CacheMetrics -> Bool
$c> :: CacheMetrics -> CacheMetrics -> Bool
<= :: CacheMetrics -> CacheMetrics -> Bool
$c<= :: CacheMetrics -> CacheMetrics -> Bool
< :: CacheMetrics -> CacheMetrics -> Bool
$c< :: CacheMetrics -> CacheMetrics -> Bool
compare :: CacheMetrics -> CacheMetrics -> Ordering
$ccompare :: CacheMetrics -> CacheMetrics -> Ordering
$cp1Ord :: Eq CacheMetrics
Ord, Int -> CacheMetrics -> ShowS
[CacheMetrics] -> ShowS
CacheMetrics -> String
(Int -> CacheMetrics -> ShowS)
-> (CacheMetrics -> String)
-> ([CacheMetrics] -> ShowS)
-> Show CacheMetrics
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CacheMetrics] -> ShowS
$cshowList :: [CacheMetrics] -> ShowS
show :: CacheMetrics -> String
$cshow :: CacheMetrics -> String
showsPrec :: Int -> CacheMetrics -> ShowS
$cshowsPrec :: Int -> CacheMetrics -> ShowS
Show )


instance Pretty CacheMetrics where
  pretty :: CacheMetrics -> Text
pretty CacheMetrics
cm = Text
"Misses/Queries: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> (String -> Text
Text.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Int -> String
forall a. Show a => a -> String
show (Int -> String) -> Int -> String
forall a b. (a -> b) -> a -> b
$ CacheMetrics -> Int
missCount CacheMetrics
cm) Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
" / " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> (String -> Text
Text.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Int -> String
forall a. Show a => a -> String
show (Int -> String) -> Int -> String
forall a b. (a -> b) -> a -> b
$ CacheMetrics -> Int
queryCount CacheMetrics
cm)