module Relay.Buffer
( Buffer (..),
emptyBuffer,
deliver,
)
where
import Data.Map.Strict (Map)
import Data.Map.Strict qualified as Map
import Relay.ReceiverHalf (ReceiverHalf, emptyReceiver, receive)
import Relay.Session (Nat, SessionId)
newtype Buffer a = Buffer (Map SessionId (ReceiverHalf a))
deriving (Int -> Buffer a -> ShowS
[Buffer a] -> ShowS
Buffer a -> String
(Int -> Buffer a -> ShowS)
-> (Buffer a -> String) -> ([Buffer a] -> ShowS) -> Show (Buffer a)
forall a. Show a => Int -> Buffer a -> ShowS
forall a. Show a => [Buffer a] -> ShowS
forall a. Show a => Buffer a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> Buffer a -> ShowS
showsPrec :: Int -> Buffer a -> ShowS
$cshow :: forall a. Show a => Buffer a -> String
show :: Buffer a -> String
$cshowList :: forall a. Show a => [Buffer a] -> ShowS
showList :: [Buffer a] -> ShowS
Show, Buffer a -> Buffer a -> Bool
(Buffer a -> Buffer a -> Bool)
-> (Buffer a -> Buffer a -> Bool) -> Eq (Buffer a)
forall a. Eq a => Buffer a -> Buffer a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => Buffer a -> Buffer a -> Bool
== :: Buffer a -> Buffer a -> Bool
$c/= :: forall a. Eq a => Buffer a -> Buffer a -> Bool
/= :: Buffer a -> Buffer a -> Bool
Eq)
emptyBuffer :: Buffer a
emptyBuffer :: forall a. Buffer a
emptyBuffer = Map SessionId (ReceiverHalf a) -> Buffer a
forall a. Map SessionId (ReceiverHalf a) -> Buffer a
Buffer Map SessionId (ReceiverHalf a)
forall k a. Map k a
Map.empty
deliver :: SessionId -> Nat -> a -> Buffer a -> (Buffer a, [a])
deliver :: forall a. SessionId -> Nat -> a -> Buffer a -> (Buffer a, [a])
deliver SessionId
sid Nat
n a
v (Buffer Map SessionId (ReceiverHalf a)
m) =
let rh :: ReceiverHalf a
rh = ReceiverHalf a
-> SessionId -> Map SessionId (ReceiverHalf a) -> ReceiverHalf a
forall k a. Ord k => a -> k -> Map k a -> a
Map.findWithDefault ReceiverHalf a
forall a. ReceiverHalf a
emptyReceiver SessionId
sid Map SessionId (ReceiverHalf a)
m
(ReceiverHalf a
rh', [a]
delivered) = Nat -> a -> ReceiverHalf a -> (ReceiverHalf a, [a])
forall a. Nat -> a -> ReceiverHalf a -> (ReceiverHalf a, [a])
receive Nat
n a
v ReceiverHalf a
rh
in (Map SessionId (ReceiverHalf a) -> Buffer a
forall a. Map SessionId (ReceiverHalf a) -> Buffer a
Buffer (SessionId
-> ReceiverHalf a
-> Map SessionId (ReceiverHalf a)
-> Map SessionId (ReceiverHalf a)
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert SessionId
sid ReceiverHalf a
rh' Map SessionId (ReceiverHalf a)
m), [a]
delivered)