module Composite.Ekg (EkgMetric(ekgMetric)) where
import Composite.Record ((:->)(Val), Rec((:&), RNil), Record)
import Data.Char (isUpper, toLower)
import Data.Functor.Identity (Identity(Identity))
import qualified Data.Text as Text
import Data.Proxy (Proxy(Proxy))
import Data.Text (Text, pack)
import GHC.TypeLits (KnownSymbol, symbolVal)
import System.Metrics (Store, createCounter, createGauge, createLabel, createDistribution)
import System.Metrics.Counter (Counter)
import System.Metrics.Gauge (Gauge)
import System.Metrics.Label (Label)
import System.Metrics.Distribution (Distribution)
class EkgMetric a where
  ekgMetric :: Text -> Store -> IO a
instance forall a s rs. (EkgMetric a, EkgMetric (Record rs), KnownSymbol s) => EkgMetric (Record ((s :-> a) ': rs)) where
  ekgMetric :: Text -> Store -> IO (Record ((s :-> a) : rs))
ekgMetric Text
prefix Store
store =
    forall {u} (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
(:&)
      forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (forall a. a -> Identity a
Identity forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (s :: Symbol) a. a -> s :-> a
Val forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. EkgMetric a => Text -> Store -> IO a
ekgMetric (Text
prefix forall a. Semigroup a => a -> a -> a
<> Text
"." forall a. Semigroup a => a -> a -> a
<> (Text -> Text
upperScores forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
pack forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> String
symbolVal) (forall {k} (t :: k). Proxy t
Proxy :: Proxy s)) Store
store)
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. EkgMetric a => Text -> Store -> IO a
ekgMetric Text
prefix Store
store
instance EkgMetric (Record '[]) where
  ekgMetric :: Text -> Store -> IO (Record '[])
ekgMetric Text
_ Store
_ = forall (f :: * -> *) a. Applicative f => a -> f a
pure forall {u} (a :: u -> *). Rec a '[]
RNil
instance EkgMetric Counter where
  ekgMetric :: Text -> Store -> IO Counter
ekgMetric = Text -> Store -> IO Counter
createCounter
instance EkgMetric Gauge where
  ekgMetric :: Text -> Store -> IO Gauge
ekgMetric = Text -> Store -> IO Gauge
createGauge
instance EkgMetric Label where
  ekgMetric :: Text -> Store -> IO Label
ekgMetric = Text -> Store -> IO Label
createLabel
instance EkgMetric Distribution where
  ekgMetric :: Text -> Store -> IO Distribution
ekgMetric = Text -> Store -> IO Distribution
createDistribution
upperScores :: Text -> Text
upperScores :: Text -> Text
upperScores = (Char -> Bool) -> Text -> Text
Text.dropWhile (forall a. Eq a => a -> a -> Bool
== Char
'_') forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Text) -> Text -> Text
Text.concatMap Char -> Text
score
  where score :: Char -> Text
        score :: Char -> Text
score Char
c | Char -> Bool
isUpper Char
c = Text
"_" forall a. Semigroup a => a -> a -> a
<> Char -> Text
Text.singleton (Char -> Char
toLower Char
c)
        score Char
c = Char -> Text
Text.singleton Char
c