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