second-transfer-0.10.0.1: hs-src/SecondTransfer/Http2/CalmState.hs
{-# LANGUAGE NamedFieldPuns, RecordWildCards #-}
module SecondTransfer.Http2.CalmState (
CalmState
, newCalmState
, getCurrentCalm
, advanceCalm
, CalmEnhacementMap
) where
--import Control.Lens
--import Data.Word (Word)
--- How to enhance the calm as word boundaries are crossed.
type CalmEnhacementMap = [(Word, Word)]
-- Struct is private,
data CalmState = CalmState {
_restOfMap :: !CalmEnhacementMap
, _currentOffset :: !Int
, _currentCalm :: !Int
}
deriving (Show, Eq)
newCalmState :: Int -> CalmEnhacementMap -> CalmState
newCalmState start_calm cemap = CalmState cemap 0 start_calm
getCurrentCalm :: CalmState -> Int
getCurrentCalm CalmState{_currentCalm} = _currentCalm
advanceCalm :: CalmState -> Int -> CalmState
advanceCalm cs@CalmState{ _restOfMap = [] } _advance_bytes = cs
advanceCalm _cs@CalmState{ _restOfMap = rom@((offset, bump):r),
_currentOffset,
_currentCalm } advance_bytes =
let
new_offset = _currentOffset + advance_bytes
crosses_boundary = fromIntegral new_offset > offset
in
CalmState {
_restOfMap = if crosses_boundary then r else rom ,
_currentOffset = new_offset,
_currentCalm = if crosses_boundary then _currentCalm + fromIntegral bump else _currentCalm
}