packages feed

http2-3.0.0: Network/HTTP2/Arch/Rate.hs

module Network.HTTP2.Arch.Rate (
    Rate
  , newRate
  , getRate
  ) where

import Data.IORef
import Data.UnixTime

newtype Rate = Rate (IORef Counter)

data Counter = Counter Int UnixTime

newRate :: IO Rate
newRate = do
    cntr <- Counter 0 <$> getUnixTime
    Rate <$> newIORef cntr

getRate :: Rate -> IO Int
getRate (Rate ref) = do
    Counter n beg <- readIORef ref
    cur <- getUnixTime
    if (cur `diffUnixTime` beg) > 1 then do
        let n' = 1
        writeIORef ref $ Counter n' cur
        return n'
      else do
        let n' = n + 1
        writeIORef ref $ Counter n' beg
        return n'