-- | Simple counter.
module Perf.Count
  ( count,
    countN,
  )
where

import Perf.Types
import Prelude

-- | Register 1 as a performance measure
count :: (Applicative m) => StepMeasure m Int
count :: forall (m :: * -> *). Applicative m => StepMeasure m Int
count = m () -> (() -> m Int) -> StepMeasure m Int
forall (m :: * -> *) t i. m i -> (i -> m t) -> StepMeasure m t
StepMeasure m ()
start () -> m Int
forall {f :: * -> *} {a} {p}. (Applicative f, Num a) => p -> f a
stop
  where
    start :: m ()
start = () -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    stop :: p -> f a
stop p
_ = a -> f a
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
1
{-# INLINEABLE count #-}

-- | Count the number of times measured.
countN :: Int -> Measure IO Int
countN :: Int -> Measure IO Int
countN Int
n = [Int] -> Int
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ([Int] -> Int) -> Measure IO [Int] -> Measure IO Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> StepMeasure IO Int -> Measure IO [Int]
forall (m :: * -> *) t.
Monad m =>
Int -> StepMeasure m t -> Measure m [t]
toMeasureN Int
n StepMeasure IO Int
forall (m :: * -> *). Applicative m => StepMeasure m Int
count
{-# INLINEABLE countN #-}