content: {-# LANGUAGE RecordWildCards #-}
  {-# LANGUAGE TupleSections #-}
  
  module Network.QUIC.Recovery.Misc (
      getPktNumPersistent,
      setPktNumPersistent,
      setSpeedingUp,
      getSpeedingUp,
      getPacketNumberSpaceDiscarded,
      getAndSetPacketNumberSpaceDiscarded,
      setMaxAckDaley,
  ) where
  
  import Data.IORef
  
  import Network.QUIC.Connector
  import Network.QUIC.Imports
  import Network.QUIC.Recovery.Types
  import Network.QUIC.Types
  
  ----------------------------------------------------------------
  -- Packet number for 1st RTT sample
  
  getPktNumPersistent :: LDCC -> IO PacketNumber
  getPktNumPersistent LDCC{..} = readIORef pktNumPersistent
  
  setPktNumPersistent :: LDCC -> IO ()
  setPktNumPersistent ldcc@LDCC{..} =
      getPacketNumber ldcc >>= writeIORef pktNumPersistent
  
  ----------------------------------------------------------------
  
  setSpeedingUp :: LDCC -> IO ()
  setSpeedingUp LDCC{..} = writeIORef speedingUp True
  
  getSpeedingUp :: LDCC -> IO Bool
  getSpeedingUp LDCC{..} = readIORef speedingUp
  
  ----------------------------------------------------------------
  
  getPacketNumberSpaceDiscarded :: LDCC -> EncryptionLevel -> IO Bool
  getPacketNumberSpaceDiscarded LDCC{..} lvl =
      readIORef (spaceDiscarded ! lvl)
  
  getAndSetPacketNumberSpaceDiscarded :: LDCC -> EncryptionLevel -> IO Bool
  getAndSetPacketNumberSpaceDiscarded LDCC{..} lvl =
      atomicModifyIORef' (spaceDiscarded ! lvl) (True,)
  
  ----------------------------------------------------------------
  
  setMaxAckDaley :: LDCC -> Microseconds -> IO ()
  setMaxAckDaley LDCC{..} delay0 =
      atomicModifyIORef'' recoveryRTT $ \rtt -> rtt{maxAckDelay1RTT = delay0}
  