1module Network.HTTP2.Arch.Rate (
2    Rate
3  , newRate
4  , getRate
5  ) where
6
7import Data.IORef
8import Data.UnixTime
9
10newtype Rate = Rate (IORef Counter)
11
12data Counter = Counter Int UnixTime
13
14newRate :: IO Rate
15newRate = do
16    cntr <- Counter 0 <$> getUnixTime
17    Rate <$> newIORef cntr
18
19getRate :: Rate -> IO Int
20getRate (Rate ref) = do
21    Counter n beg <- readIORef ref
22    cur <- getUnixTime
23    if (cur `diffUnixTime` beg) > 1 then do
24        let n' = 1
25        writeIORef ref $ Counter n' cur
26        return n'
27      else do
28        let n' = n + 1
29        writeIORef ref $ Counter n' beg
30        return n'
31