module Ouroboros.Consensus.MiniProtocol.ObjectDiffusion.ObjectPool.API
( ObjectPoolReader (..)
, ObjectPoolWriter (..)
, prop_objectsAfterAreGreaterThanTicket
, prop_objectsAfterArePresentOnWriter
) where
import Control.Concurrent.Class.MonadSTM.Strict (MonadSTM (..), STM)
import Data.Map (Map)
import qualified Data.Map.Strict as Map
import Data.Word (Word64)
data ObjectPoolReader objectId object ticketNo m
= ObjectPoolReader
{ forall objectId object ticketNo (m :: * -> *).
ObjectPoolReader objectId object ticketNo m -> object -> objectId
oprObjectId :: object -> objectId
, forall objectId object ticketNo (m :: * -> *).
ObjectPoolReader objectId object ticketNo m -> ticketNo
oprZeroTicketNo :: ticketNo
, forall objectId object ticketNo (m :: * -> *).
ObjectPoolReader objectId object ticketNo m
-> ticketNo -> Word64 -> STM m (Maybe (m (Map ticketNo object)))
oprObjectsAfter :: ticketNo -> Word64 -> STM m (Maybe (m (Map ticketNo object)))
}
data ObjectPoolWriter objectId object m
= ObjectPoolWriter
{ forall objectId object (m :: * -> *).
ObjectPoolWriter objectId object m -> object -> objectId
opwObjectId :: object -> objectId
, forall objectId object (m :: * -> *).
ObjectPoolWriter objectId object m -> [object] -> m ()
opwAddObjects :: [object] -> m ()
, forall objectId object (m :: * -> *).
ObjectPoolWriter objectId object m -> STM m (objectId -> Bool)
opwHasObject :: STM m (objectId -> Bool)
}
prop_objectsAfterAreGreaterThanTicket ::
(Ord ticketNo, MonadSTM m) =>
ObjectPoolReader objectId object ticketNo m ->
ticketNo ->
Word64 ->
m Bool
prop_objectsAfterAreGreaterThanTicket :: forall ticketNo (m :: * -> *) objectId object.
(Ord ticketNo, MonadSTM m) =>
ObjectPoolReader objectId object ticketNo m
-> ticketNo -> Word64 -> m Bool
prop_objectsAfterAreGreaterThanTicket ObjectPoolReader objectId object ticketNo m
opr ticketNo
ticketNo Word64
limit = do
mObjects <- STM m (Maybe (m (Map ticketNo object)))
-> m (Maybe (m (Map ticketNo object)))
forall a. HasCallStack => STM m a -> m a
forall (m :: * -> *) a.
(MonadSTM m, HasCallStack) =>
STM m a -> m a
atomically (STM m (Maybe (m (Map ticketNo object)))
-> m (Maybe (m (Map ticketNo object))))
-> STM m (Maybe (m (Map ticketNo object)))
-> m (Maybe (m (Map ticketNo object)))
forall a b. (a -> b) -> a -> b
$ ObjectPoolReader objectId object ticketNo m
-> ticketNo -> Word64 -> STM m (Maybe (m (Map ticketNo object)))
forall objectId object ticketNo (m :: * -> *).
ObjectPoolReader objectId object ticketNo m
-> ticketNo -> Word64 -> STM m (Maybe (m (Map ticketNo object)))
oprObjectsAfter ObjectPoolReader objectId object ticketNo m
opr ticketNo
ticketNo Word64
limit
case mObjects of
Maybe (m (Map ticketNo object))
Nothing ->
Bool -> m Bool
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True
Just m (Map ticketNo object)
getObjects -> do
objects <- m (Map ticketNo object)
getObjects
pure $
all
(> ticketNo)
(Map.keys objects)
prop_objectsAfterArePresentOnWriter ::
MonadSTM m =>
ObjectPoolReader objectId object ticketNo m ->
ObjectPoolWriter objectId object m ->
ticketNo ->
Word64 ->
m Bool
prop_objectsAfterArePresentOnWriter :: forall (m :: * -> *) objectId object ticketNo.
MonadSTM m =>
ObjectPoolReader objectId object ticketNo m
-> ObjectPoolWriter objectId object m
-> ticketNo
-> Word64
-> m Bool
prop_objectsAfterArePresentOnWriter ObjectPoolReader objectId object ticketNo m
opr ObjectPoolWriter objectId object m
opw ticketNo
ticketNo Word64
limit = do
(mObjects, hasObject) <-
STM m (Maybe (m (Map ticketNo object)), objectId -> Bool)
-> m (Maybe (m (Map ticketNo object)), objectId -> Bool)
forall a. HasCallStack => STM m a -> m a
forall (m :: * -> *) a.
(MonadSTM m, HasCallStack) =>
STM m a -> m a
atomically (STM m (Maybe (m (Map ticketNo object)), objectId -> Bool)
-> m (Maybe (m (Map ticketNo object)), objectId -> Bool))
-> STM m (Maybe (m (Map ticketNo object)), objectId -> Bool)
-> m (Maybe (m (Map ticketNo object)), objectId -> Bool)
forall a b. (a -> b) -> a -> b
$
(,)
(Maybe (m (Map ticketNo object))
-> (objectId -> Bool)
-> (Maybe (m (Map ticketNo object)), objectId -> Bool))
-> STM m (Maybe (m (Map ticketNo object)))
-> STM
m
((objectId -> Bool)
-> (Maybe (m (Map ticketNo object)), objectId -> Bool))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ObjectPoolReader objectId object ticketNo m
-> ticketNo -> Word64 -> STM m (Maybe (m (Map ticketNo object)))
forall objectId object ticketNo (m :: * -> *).
ObjectPoolReader objectId object ticketNo m
-> ticketNo -> Word64 -> STM m (Maybe (m (Map ticketNo object)))
oprObjectsAfter ObjectPoolReader objectId object ticketNo m
opr ticketNo
ticketNo Word64
limit
STM
m
((objectId -> Bool)
-> (Maybe (m (Map ticketNo object)), objectId -> Bool))
-> STM m (objectId -> Bool)
-> STM m (Maybe (m (Map ticketNo object)), objectId -> Bool)
forall a b. STM m (a -> b) -> STM m a -> STM m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ObjectPoolWriter objectId object m -> STM m (objectId -> Bool)
forall objectId object (m :: * -> *).
ObjectPoolWriter objectId object m -> STM m (objectId -> Bool)
opwHasObject ObjectPoolWriter objectId object m
opw
case mObjects of
Maybe (m (Map ticketNo object))
Nothing ->
Bool -> m Bool
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True
Just m (Map ticketNo object)
getObjects -> do
objects <- m (Map ticketNo object)
getObjects
pure $
all
(hasObject . oprObjectId opr)
(Map.elems objects)