\subsection{Cardano.BM.Data.Transformers}
\label{code:Cardano.BM.Data.Transformers}

%if style == newcode
\begin{code}
{-# LANGUAGE RankNTypes          #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Cardano.BM.Data.Transformers
  ( liftCounting
  , liftFolding
  , setHostname
  )
  where

import           Data.Text (Text)

import           Cardano.BM.Data.Aggregated (Measurable (..))
import           Cardano.BM.Data.LogItem (LOContent (..), LOMeta (..),
                     LogObject (..), LoggerName)
import           Cardano.BM.Data.Tracer (Tracer (..), traceWith)
import           Cardano.BM.Data.Trace

import           Control.Tracer.Transformers
\end{code}

\subsubsection{Transformer for counting events}
\label{code:liftCounting}
\index{liftCounting}
Lift a 'Counting' tracer into a 'Trace' of 'PureI' messages.
\begin{code}

liftCounting
  :: forall m a
  .  LOMeta -> LoggerName -> Text -> Trace m a
  -> Tracer m (Counting (LoggerName, LogObject a))
liftCounting :: LOMeta
-> LoggerName
-> LoggerName
-> Trace m a
-> Tracer m (Counting (LoggerName, LogObject a))
liftCounting LOMeta
meta LoggerName
name LoggerName
desc Trace m a
tr = (Counting (LoggerName, LogObject a) -> m ())
-> Tracer m (Counting (LoggerName, LogObject a))
forall (m :: * -> *) a. (a -> m ()) -> Tracer m a
Tracer (Trace m a -> Counting (LoggerName, LogObject a) -> m ()
traceIncrement Trace m a
tr)
 where
   traceIncrement :: Trace m a -> Counting (LoggerName, LogObject a) -> m ()
   traceIncrement :: Trace m a -> Counting (LoggerName, LogObject a) -> m ()
traceIncrement Trace m a
t (Counting Int
n) =
    --  traceWith t . LogObject name meta . LogValue desc . PureI $ fromIntegral n
     Trace m a -> (LoggerName, LogObject a) -> m ()
forall (m :: * -> *) a. Tracer m a -> a -> m ()
traceWith Trace m a
t ((LoggerName, LogObject a) -> m ())
-> (LoggerName, LogObject a) -> m ()
forall a b. (a -> b) -> a -> b
$ (LoggerName
name, LoggerName -> LOMeta -> LOContent a -> LogObject a
forall a. LoggerName -> LOMeta -> LOContent a -> LogObject a
LogObject LoggerName
name LOMeta
meta (LOContent a -> LogObject a)
-> (Integer -> LOContent a) -> Integer -> LogObject a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LoggerName -> Measurable -> LOContent a
forall a. LoggerName -> Measurable -> LOContent a
LogValue LoggerName
desc (Measurable -> LOContent a)
-> (Integer -> Measurable) -> Integer -> LOContent a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Measurable
PureI (Integer -> LogObject a) -> Integer -> LogObject a
forall a b. (a -> b) -> a -> b
$ Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n)

\end{code}

\subsubsection{Transformer for state folding}
\label{code:liftFolding}
\index{liftFolding}
Lift a 'Trace' tracer into a 'Trace' of 'PureI' messages,
thereby specialising it to 'Integral'.
\begin{code}

liftFolding
  :: forall m f a
  .  (Integral f) -- TODO:  generalise
  => LOMeta -> LoggerName -> Text -> Trace m a
  -> Tracer m (Folding (LoggerName, LogObject a) f)
liftFolding :: LOMeta
-> LoggerName
-> LoggerName
-> Trace m a
-> Tracer m (Folding (LoggerName, LogObject a) f)
liftFolding LOMeta
meta LoggerName
name LoggerName
desc Trace m a
tr = (Folding (LoggerName, LogObject a) f -> m ())
-> Tracer m (Folding (LoggerName, LogObject a) f)
forall (m :: * -> *) a. (a -> m ()) -> Tracer m a
Tracer (Trace m a -> Folding (LoggerName, LogObject a) f -> m ()
traceIncrement Trace m a
tr)
 where
   traceIncrement :: Trace m a -> Folding (LoggerName, LogObject a) f -> m ()
   traceIncrement :: Trace m a -> Folding (LoggerName, LogObject a) f -> m ()
traceIncrement Trace m a
t (Folding f
f) =
     Trace m a -> (LoggerName, LogObject a) -> m ()
forall (m :: * -> *) a. Tracer m a -> a -> m ()
traceWith Trace m a
t ((LoggerName, LogObject a) -> m ())
-> (LoggerName, LogObject a) -> m ()
forall a b. (a -> b) -> a -> b
$ (LoggerName
name, LoggerName -> LOMeta -> LOContent a -> LogObject a
forall a. LoggerName -> LOMeta -> LOContent a -> LogObject a
LogObject LoggerName
name LOMeta
meta (LOContent a -> LogObject a)
-> (Integer -> LOContent a) -> Integer -> LogObject a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LoggerName -> Measurable -> LOContent a
forall a. LoggerName -> Measurable -> LOContent a
LogValue LoggerName
desc (Measurable -> LOContent a)
-> (Integer -> Measurable) -> Integer -> LOContent a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Measurable
PureI (Integer -> LogObject a) -> Integer -> LogObject a
forall a b. (a -> b) -> a -> b
$ f -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral f
f)

\end{code}

\subsubsection{Transformer for setting hostname annotation}
\label{code:setHostname}
\index{setHostname}
The hostname annotation of the |LogObject| can be altered.
\begin{code}
setHostname :: Text -> Trace m a -> Trace m a
setHostname :: LoggerName -> Trace m a -> Trace m a
setHostname LoggerName
hn Trace m a
tr = ((LoggerName, LogObject a) -> m ()) -> Trace m a
forall (m :: * -> *) a. (a -> m ()) -> Tracer m a
Tracer (((LoggerName, LogObject a) -> m ()) -> Trace m a)
-> ((LoggerName, LogObject a) -> m ()) -> Trace m a
forall a b. (a -> b) -> a -> b
$ \(LoggerName
ctx, lo :: LogObject a
lo@(LogObject LoggerName
_ln LOMeta
meta LOContent a
_lc)) ->
    Trace m a -> (LoggerName, LogObject a) -> m ()
forall (m :: * -> *) a. Tracer m a -> a -> m ()
traceWith Trace m a
tr (LoggerName
ctx, LogObject a
lo { loMeta :: LOMeta
loMeta = LOMeta
meta { hostname :: LoggerName
hostname = LoggerName
hn }})

\end{code}