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'