purescript-metrics/src/System/Metrics/Meter.purs

68 lines
2.2 KiB
Plaintext

module System.Metrics.Meter
( Meter
, Summary
, new
, markN
, mark
, fifteenMinuteRate
, fiveMinuteRate
, oneMinuteRate
, meanRate
, count
, read
) where
import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Ref (REF)
import Data.Foreign.Class (class Encode)
import Data.Foreign.Generic (defaultOptions, genericEncode)
import Data.Function.Uncurried (Fn2, runFn2)
import Data.Generic.Rep (class Generic)
import Data.Generic.Rep.Show (genericShow)
import Prelude
foreign import data Meter :: Type
foreign import _new :: forall eff. Eff (ref :: REF | eff) Meter
foreign import _markN :: forall eff. Fn2 Meter Int (Eff (ref :: REF | eff) Unit)
foreign import fifteenMinuteRate :: forall eff. Meter -> Eff (ref :: REF | eff) Number
foreign import fiveMinuteRate :: forall eff. Meter -> Eff (ref :: REF | eff) Number
foreign import oneMinuteRate :: forall eff. Meter -> Eff (ref :: REF | eff) Number
foreign import meanRate :: forall eff. Meter -> Eff (ref :: REF | eff) Number
foreign import count :: forall eff. Meter -> Eff (ref :: REF | eff) Int
new :: forall eff. Eff (ref :: REF | eff) Meter
new = _new
markN :: forall eff. Meter -> Int -> Eff (ref :: REF | eff) Unit
markN = runFn2 _markN
mark :: forall eff. Meter -> Eff (ref :: REF | eff) Unit
mark m = markN m 1
newtype Summary = Summary {
count :: Int
, m1 :: Number
, m5 :: Number
, m15 :: Number
, mean :: Number
}
derive instance eqMSummary :: Eq Summary
derive instance genericMSummary :: Generic Summary _
instance showMSummary :: Show Summary where
show = genericShow
instance encodeMSummary :: Encode Summary where
encode = genericEncode $ defaultOptions { unwrapSingleConstructors = true }
read :: forall eff. Meter -> Eff (ref :: REF | eff) Summary
read m = Summary <$> ({ count: _
, m1: _
, m5: _
, m15: _
, mean: _
} <$> count m
<*> oneMinuteRate m
<*> fiveMinuteRate m
<*> fifteenMinuteRate m
<*> meanRate m)