packages feed

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
    }