-- |
-- Module      : Relay.SenderHalf
-- Description : Sender half of the sequencing protocol.
module Relay.SenderHalf
  ( SenderHalf (..),
    emptySender,
    assign,
  )
where

import Relay.Session (Nat)

-- | Local state of one sending session.
newtype SenderHalf = SenderHalf
  { SenderHalf -> Nat
nextSeq :: Nat
  }
  deriving (Int -> SenderHalf -> ShowS
[SenderHalf] -> ShowS
SenderHalf -> String
(Int -> SenderHalf -> ShowS)
-> (SenderHalf -> String)
-> ([SenderHalf] -> ShowS)
-> Show SenderHalf
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SenderHalf -> ShowS
showsPrec :: Int -> SenderHalf -> ShowS
$cshow :: SenderHalf -> String
show :: SenderHalf -> String
$cshowList :: [SenderHalf] -> ShowS
showList :: [SenderHalf] -> ShowS
Show, SenderHalf -> SenderHalf -> Bool
(SenderHalf -> SenderHalf -> Bool)
-> (SenderHalf -> SenderHalf -> Bool) -> Eq SenderHalf
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SenderHalf -> SenderHalf -> Bool
== :: SenderHalf -> SenderHalf -> Bool
$c/= :: SenderHalf -> SenderHalf -> Bool
/= :: SenderHalf -> SenderHalf -> Bool
Eq)

-- | Initial sender state. The first assigned sequence number is 1.
emptySender :: SenderHalf
emptySender :: SenderHalf
emptySender = SenderHalf {nextSeq :: Nat
nextSeq = Nat
1}

-- | Return the next sequence number and advance the counter.
assign :: SenderHalf -> (Nat, SenderHalf)
assign :: SenderHalf -> (Nat, SenderHalf)
assign SenderHalf
sh = (SenderHalf -> Nat
nextSeq SenderHalf
sh, SenderHalf
sh {nextSeq = nextSeq sh + 1})