{-# LANGUAGE TypeFamilyDependencies #-}

module System.Metrics.Monad.Class where

import qualified Data.Text as T
import Control.Monad.IO.Class
import GHC.TypeLits
import System.Metrics
import Type.Reflection

class Typeable tracker => TrackerLike tracker where
  type TrackAction tracker (m :: * -> *) = r | r -> m
  track :: (MonadMetrics m, KnownSymbol name, Typeable metric, Ord (metric tracker name)) => metric tracker name -> TrackAction tracker m
  createTracker :: T.Text -> Store -> IO tracker

class MonadIO m => MonadMetrics m where
  getTracker :: (TrackerLike tracker, KnownSymbol name, Typeable metric, Ord (metric tracker name))
             => metric tracker name -> m tracker