{-# LANGUAGE ConstraintKinds   #-}
{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TemplateHaskell   #-}

-- | Context objects for monad transformers.
--
module Preamble.Types.Ctx
  ( module Preamble.Types.Ctx
  ) where

import Control.Monad.Catch
import Control.Monad.Logger
import Control.Monad.Reader
import Preamble.Lens
import Preamble.Prelude
import Preamble.Types.Alias

-- | Ctx
--
-- Base context, supports tracing.
--
data Ctx = Ctx
  { _cPreamble :: Pairs
    -- ^ Object to encode on every trace line.
  , _cLogger   :: Logger
    -- ^ Configurable tracing function.
  }

$(makeClassy ''Ctx)

type MonadCtx c m =
  ( MonadControl m
  , MonadReader c m
  , MonadLogger m
  , MonadCatch m
  , MonadThrow m
  , HasCtx c
  )

-- | StatsCtx
--
-- Stats context.
--
data StatsCtx = StatsCtx
  { _scCtx    :: Ctx
    -- ^ Parent environment.
  , _scLabels :: Tags
    -- ^ Tags to append to every stat.
  , _scStat   :: Stat
    -- ^ Configurable stat function.
  , _scPrefix :: Text
    -- ^ Stats prefix.
  }

$(makeClassyConstraints ''StatsCtx [''HasCtx])

instance HasCtx StatsCtx where
  ctx = scCtx

type MonadStatsCtx c m =
  ( MonadCtx c m
  , HasStatsCtx c
  )