{-# LANGUAGE MultiParamTypeClasses #-}

module Arbor.Network.StatsD.Monad where

import Arbor.Network.StatsD.Datadog
import Control.Monad.Except
import Control.Monad.Reader
import Control.Monad.State
import Control.Monad.Trans.Identity
import Control.Monad.Trans.Maybe
import Control.Monad.Trans.Resource

class (Functor m, Applicative m, MonadIO m) => MonadStats m where
  getStatsClient :: m StatsClient

instance MonadStats m => MonadStats (ExceptT e m) where
  getStatsClient = lift getStatsClient

instance MonadStats m => MonadStats (IdentityT m) where
  getStatsClient = lift getStatsClient

instance MonadStats m => MonadStats (MaybeT m) where
  getStatsClient = lift getStatsClient

instance MonadStats m => MonadStats (ReaderT e m) where
  getStatsClient = lift getStatsClient

instance MonadStats m => MonadStats (ResourceT m) where
  getStatsClient = lift getStatsClient

instance MonadStats m => MonadStats (StateT s m) where
  getStatsClient = lift getStatsClient

sendMetric :: MonadStats m => Metric -> m ()
sendMetric m = getStatsClient >>= flip sendSampled m

sendEvent :: MonadStats m => Event -> m ()
sendEvent e = getStatsClient >>= flip sendEvt e