{-# LANGUAGE DataKinds                  #-}
{-# LANGUAGE DeriveFoldable             #-}
{-# LANGUAGE DeriveGeneric              #-}
{-# LANGUAGE DerivingVia                #-}
{-# LANGUAGE FlexibleInstances          #-}
{-# LANGUAGE GADTs                      #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE PolyKinds                  #-}
{-# LANGUAGE ScopedTypeVariables        #-}
{-# LANGUAGE StandaloneDeriving         #-}
{-# LANGUAGE StandaloneKindSignatures   #-}
{-# LANGUAGE TypeFamilies               #-}

-- | The type of the object diffusion protocol.
--
-- This is used to diffuse generic objects between nodes.
module Ouroboros.Network.Protocol.ObjectDiffusion.Type
  ( ObjectDiffusion (..)
  , Message (..)
  , SingObjectDiffusion (..)
  , NumObjectIdsAck (..)
  , NumObjectIdsReq (..)
  , NumObjectsReq (..)
  , NumObjectsUnacknowledged (..)
    -- re-exports
  , BlockingReplyList (..)
  , SingBlockingStyle (..)
  , SizeInBytes (..)
  , StBlockingStyle (..)
  ) where

import Control.DeepSeq (NFData (..))
import Data.Kind (Type)
import Data.Monoid (Sum (..))
import Data.Singletons
import Data.Word (Word16)
import GHC.Generics (Generic)
import Network.TypedProtocol.Core
import NoThunks.Class (NoThunks (..))
import Ouroboros.Network.Protocol.TxSubmission2.Type (BlockingReplyList (..),
           SingBlockingStyle (..), StBlockingStyle (..))
import Ouroboros.Network.SizeInBytes (SizeInBytes (..))
import Ouroboros.Network.Util.ShowProxy (ShowProxy (..))
import Quiet (Quiet (..))

-- | The kind of the object diffusion protocol, and the types of the states in
-- the protocol state machine.
--
-- We describe this protocol using indiscriminately the labels \"inbound\"/\"client\"
-- for the peer that is receiving objects, and \"outbound\"/\"server\" for the one
-- sending them.
type ObjectDiffusion :: Type -> Type -> Type
data ObjectDiffusion objectId object where
  -- | Initial protocol message.
  StInit      :: ObjectDiffusion objectId object
  -- | The inbound node has agency; it can either terminate, ask for object
  -- identifiers or ask for objects.
  --
  -- There is no timeout in this state.
  StIdle      :: ObjectDiffusion objectId object
  -- | The outbound node has agency; it must reply with a list of object
  -- identifiers that it wishes to submit.
  --
  -- There are two sub-states for this, for blocking and non-blocking cases.
  StObjectIds :: StBlockingStyle -> ObjectDiffusion objectId object
  -- | The outbound node has agency; it must reply with the list of
  -- objects.
  StObjects   :: ObjectDiffusion objectId object
  -- | Nobody has agency; termination state.
  StDone      :: ObjectDiffusion objectId object

instance ( ShowProxy objectId
         , ShowProxy object
         )
      => ShowProxy (ObjectDiffusion objectId object) where
  showProxy :: Proxy (ObjectDiffusion objectId object) -> String
showProxy Proxy (ObjectDiffusion objectId object)
_ =
    [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
      [ String
"ObjectDiffusion ",
        Proxy objectId -> String
forall {k} (p :: k). ShowProxy p => Proxy p -> String
showProxy (Proxy objectId
forall {k} (t :: k). Proxy t
Proxy :: Proxy objectId),
        String
" ",
        Proxy object -> String
forall {k} (p :: k). ShowProxy p => Proxy p -> String
showProxy (Proxy object
forall {k} (t :: k). Proxy t
Proxy :: Proxy object)
      ]

instance ShowProxy (StIdle :: ObjectDiffusion objectId object) where
  showProxy :: Proxy 'StIdle -> String
showProxy Proxy 'StIdle
_ = String
"StIdle"

type SingObjectDiffusion
  :: ObjectDiffusion objectId object
  -> Type
data SingObjectDiffusion k where
  SingInit      :: SingObjectDiffusion StInit
  SingIdle      :: SingObjectDiffusion StIdle
  SingObjectIds :: SingBlockingStyle stBlocking
                -> SingObjectDiffusion (StObjectIds stBlocking)
  SingObjects   :: SingObjectDiffusion StObjects
  SingDone      :: SingObjectDiffusion StDone

deriving instance Show (SingObjectDiffusion k)

instance StateTokenI StInit where stateToken :: StateToken 'StInit
stateToken = StateToken 'StInit
SingObjectDiffusion 'StInit
forall {objectId} {object}. SingObjectDiffusion 'StInit
SingInit
instance StateTokenI StIdle where stateToken :: StateToken 'StIdle
stateToken = StateToken 'StIdle
SingObjectDiffusion 'StIdle
forall {objectId} {object}. SingObjectDiffusion 'StIdle
SingIdle
instance (SingI stBlocking)
      => StateTokenI (StObjectIds stBlocking) where
  stateToken :: StateToken ('StObjectIds stBlocking)
stateToken = SingBlockingStyle stBlocking
-> SingObjectDiffusion ('StObjectIds stBlocking)
forall {objectId} {object} (stBlocking :: StBlockingStyle).
SingBlockingStyle stBlocking
-> SingObjectDiffusion ('StObjectIds stBlocking)
SingObjectIds Sing stBlocking
SingBlockingStyle stBlocking
forall {k} (a :: k). SingI a => Sing a
sing
instance StateTokenI StObjects where stateToken :: StateToken 'StObjects
stateToken = StateToken 'StObjects
SingObjectDiffusion 'StObjects
forall {objectId} {object}. SingObjectDiffusion 'StObjects
SingObjects
instance StateTokenI StDone where stateToken :: StateToken 'StDone
stateToken = StateToken 'StDone
SingObjectDiffusion 'StDone
forall {objectId} {object}. SingObjectDiffusion 'StDone
SingDone


newtype NumObjectIdsAck = NumObjectIdsAck {NumObjectIdsAck -> Word16
getNumObjectIdsAck :: Word16}
  deriving (NumObjectIdsAck -> NumObjectIdsAck -> Bool
(NumObjectIdsAck -> NumObjectIdsAck -> Bool)
-> (NumObjectIdsAck -> NumObjectIdsAck -> Bool)
-> Eq NumObjectIdsAck
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: NumObjectIdsAck -> NumObjectIdsAck -> Bool
== :: NumObjectIdsAck -> NumObjectIdsAck -> Bool
$c/= :: NumObjectIdsAck -> NumObjectIdsAck -> Bool
/= :: NumObjectIdsAck -> NumObjectIdsAck -> Bool
Eq, Eq NumObjectIdsAck
Eq NumObjectIdsAck =>
(NumObjectIdsAck -> NumObjectIdsAck -> Ordering)
-> (NumObjectIdsAck -> NumObjectIdsAck -> Bool)
-> (NumObjectIdsAck -> NumObjectIdsAck -> Bool)
-> (NumObjectIdsAck -> NumObjectIdsAck -> Bool)
-> (NumObjectIdsAck -> NumObjectIdsAck -> Bool)
-> (NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck)
-> (NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck)
-> Ord NumObjectIdsAck
NumObjectIdsAck -> NumObjectIdsAck -> Bool
NumObjectIdsAck -> NumObjectIdsAck -> Ordering
NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: NumObjectIdsAck -> NumObjectIdsAck -> Ordering
compare :: NumObjectIdsAck -> NumObjectIdsAck -> Ordering
$c< :: NumObjectIdsAck -> NumObjectIdsAck -> Bool
< :: NumObjectIdsAck -> NumObjectIdsAck -> Bool
$c<= :: NumObjectIdsAck -> NumObjectIdsAck -> Bool
<= :: NumObjectIdsAck -> NumObjectIdsAck -> Bool
$c> :: NumObjectIdsAck -> NumObjectIdsAck -> Bool
> :: NumObjectIdsAck -> NumObjectIdsAck -> Bool
$c>= :: NumObjectIdsAck -> NumObjectIdsAck -> Bool
>= :: NumObjectIdsAck -> NumObjectIdsAck -> Bool
$cmax :: NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
max :: NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
$cmin :: NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
min :: NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
Ord, NumObjectIdsAck -> ()
(NumObjectIdsAck -> ()) -> NFData NumObjectIdsAck
forall a. (a -> ()) -> NFData a
$crnf :: NumObjectIdsAck -> ()
rnf :: NumObjectIdsAck -> ()
NFData, (forall x. NumObjectIdsAck -> Rep NumObjectIdsAck x)
-> (forall x. Rep NumObjectIdsAck x -> NumObjectIdsAck)
-> Generic NumObjectIdsAck
forall x. Rep NumObjectIdsAck x -> NumObjectIdsAck
forall x. NumObjectIdsAck -> Rep NumObjectIdsAck x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. NumObjectIdsAck -> Rep NumObjectIdsAck x
from :: forall x. NumObjectIdsAck -> Rep NumObjectIdsAck x
$cto :: forall x. Rep NumObjectIdsAck x -> NumObjectIdsAck
to :: forall x. Rep NumObjectIdsAck x -> NumObjectIdsAck
Generic)
  deriving newtype (Integer -> NumObjectIdsAck
NumObjectIdsAck -> NumObjectIdsAck
NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
(NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck)
-> (NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck)
-> (NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck)
-> (NumObjectIdsAck -> NumObjectIdsAck)
-> (NumObjectIdsAck -> NumObjectIdsAck)
-> (NumObjectIdsAck -> NumObjectIdsAck)
-> (Integer -> NumObjectIdsAck)
-> Num NumObjectIdsAck
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
$c+ :: NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
+ :: NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
$c- :: NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
- :: NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
$c* :: NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
* :: NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
$cnegate :: NumObjectIdsAck -> NumObjectIdsAck
negate :: NumObjectIdsAck -> NumObjectIdsAck
$cabs :: NumObjectIdsAck -> NumObjectIdsAck
abs :: NumObjectIdsAck -> NumObjectIdsAck
$csignum :: NumObjectIdsAck -> NumObjectIdsAck
signum :: NumObjectIdsAck -> NumObjectIdsAck
$cfromInteger :: Integer -> NumObjectIdsAck
fromInteger :: Integer -> NumObjectIdsAck
Num, Int -> NumObjectIdsAck
NumObjectIdsAck -> Int
NumObjectIdsAck -> [NumObjectIdsAck]
NumObjectIdsAck -> NumObjectIdsAck
NumObjectIdsAck -> NumObjectIdsAck -> [NumObjectIdsAck]
NumObjectIdsAck
-> NumObjectIdsAck -> NumObjectIdsAck -> [NumObjectIdsAck]
(NumObjectIdsAck -> NumObjectIdsAck)
-> (NumObjectIdsAck -> NumObjectIdsAck)
-> (Int -> NumObjectIdsAck)
-> (NumObjectIdsAck -> Int)
-> (NumObjectIdsAck -> [NumObjectIdsAck])
-> (NumObjectIdsAck -> NumObjectIdsAck -> [NumObjectIdsAck])
-> (NumObjectIdsAck -> NumObjectIdsAck -> [NumObjectIdsAck])
-> (NumObjectIdsAck
    -> NumObjectIdsAck -> NumObjectIdsAck -> [NumObjectIdsAck])
-> Enum NumObjectIdsAck
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: NumObjectIdsAck -> NumObjectIdsAck
succ :: NumObjectIdsAck -> NumObjectIdsAck
$cpred :: NumObjectIdsAck -> NumObjectIdsAck
pred :: NumObjectIdsAck -> NumObjectIdsAck
$ctoEnum :: Int -> NumObjectIdsAck
toEnum :: Int -> NumObjectIdsAck
$cfromEnum :: NumObjectIdsAck -> Int
fromEnum :: NumObjectIdsAck -> Int
$cenumFrom :: NumObjectIdsAck -> [NumObjectIdsAck]
enumFrom :: NumObjectIdsAck -> [NumObjectIdsAck]
$cenumFromThen :: NumObjectIdsAck -> NumObjectIdsAck -> [NumObjectIdsAck]
enumFromThen :: NumObjectIdsAck -> NumObjectIdsAck -> [NumObjectIdsAck]
$cenumFromTo :: NumObjectIdsAck -> NumObjectIdsAck -> [NumObjectIdsAck]
enumFromTo :: NumObjectIdsAck -> NumObjectIdsAck -> [NumObjectIdsAck]
$cenumFromThenTo :: NumObjectIdsAck
-> NumObjectIdsAck -> NumObjectIdsAck -> [NumObjectIdsAck]
enumFromThenTo :: NumObjectIdsAck
-> NumObjectIdsAck -> NumObjectIdsAck -> [NumObjectIdsAck]
Enum, Num NumObjectIdsAck
Ord NumObjectIdsAck
(Num NumObjectIdsAck, Ord NumObjectIdsAck) =>
(NumObjectIdsAck -> Rational) -> Real NumObjectIdsAck
NumObjectIdsAck -> Rational
forall a. (Num a, Ord a) => (a -> Rational) -> Real a
$ctoRational :: NumObjectIdsAck -> Rational
toRational :: NumObjectIdsAck -> Rational
Real, Enum NumObjectIdsAck
Real NumObjectIdsAck
(Real NumObjectIdsAck, Enum NumObjectIdsAck) =>
(NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck)
-> (NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck)
-> (NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck)
-> (NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck)
-> (NumObjectIdsAck
    -> NumObjectIdsAck -> (NumObjectIdsAck, NumObjectIdsAck))
-> (NumObjectIdsAck
    -> NumObjectIdsAck -> (NumObjectIdsAck, NumObjectIdsAck))
-> (NumObjectIdsAck -> Integer)
-> Integral NumObjectIdsAck
NumObjectIdsAck -> Integer
NumObjectIdsAck
-> NumObjectIdsAck -> (NumObjectIdsAck, NumObjectIdsAck)
NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
forall a.
(Real a, Enum a) =>
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> (a, a))
-> (a -> a -> (a, a))
-> (a -> Integer)
-> Integral a
$cquot :: NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
quot :: NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
$crem :: NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
rem :: NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
$cdiv :: NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
div :: NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
$cmod :: NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
mod :: NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
$cquotRem :: NumObjectIdsAck
-> NumObjectIdsAck -> (NumObjectIdsAck, NumObjectIdsAck)
quotRem :: NumObjectIdsAck
-> NumObjectIdsAck -> (NumObjectIdsAck, NumObjectIdsAck)
$cdivMod :: NumObjectIdsAck
-> NumObjectIdsAck -> (NumObjectIdsAck, NumObjectIdsAck)
divMod :: NumObjectIdsAck
-> NumObjectIdsAck -> (NumObjectIdsAck, NumObjectIdsAck)
$ctoInteger :: NumObjectIdsAck -> Integer
toInteger :: NumObjectIdsAck -> Integer
Integral, NumObjectIdsAck
NumObjectIdsAck -> NumObjectIdsAck -> Bounded NumObjectIdsAck
forall a. a -> a -> Bounded a
$cminBound :: NumObjectIdsAck
minBound :: NumObjectIdsAck
$cmaxBound :: NumObjectIdsAck
maxBound :: NumObjectIdsAck
Bounded, [String] -> NumObjectIdsAck -> IO (Maybe ThunkInfo)
Proxy NumObjectIdsAck -> String
([String] -> NumObjectIdsAck -> IO (Maybe ThunkInfo))
-> ([String] -> NumObjectIdsAck -> IO (Maybe ThunkInfo))
-> (Proxy NumObjectIdsAck -> String)
-> NoThunks NumObjectIdsAck
forall a.
([String] -> a -> IO (Maybe ThunkInfo))
-> ([String] -> a -> IO (Maybe ThunkInfo))
-> (Proxy a -> String)
-> NoThunks a
$cnoThunks :: [String] -> NumObjectIdsAck -> IO (Maybe ThunkInfo)
noThunks :: [String] -> NumObjectIdsAck -> IO (Maybe ThunkInfo)
$cwNoThunks :: [String] -> NumObjectIdsAck -> IO (Maybe ThunkInfo)
wNoThunks :: [String] -> NumObjectIdsAck -> IO (Maybe ThunkInfo)
$cshowTypeOf :: Proxy NumObjectIdsAck -> String
showTypeOf :: Proxy NumObjectIdsAck -> String
NoThunks)
  deriving (NonEmpty NumObjectIdsAck -> NumObjectIdsAck
NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
(NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck)
-> (NonEmpty NumObjectIdsAck -> NumObjectIdsAck)
-> (forall b.
    Integral b =>
    b -> NumObjectIdsAck -> NumObjectIdsAck)
-> Semigroup NumObjectIdsAck
forall b. Integral b => b -> NumObjectIdsAck -> NumObjectIdsAck
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
$c<> :: NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
<> :: NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
$csconcat :: NonEmpty NumObjectIdsAck -> NumObjectIdsAck
sconcat :: NonEmpty NumObjectIdsAck -> NumObjectIdsAck
$cstimes :: forall b. Integral b => b -> NumObjectIdsAck -> NumObjectIdsAck
stimes :: forall b. Integral b => b -> NumObjectIdsAck -> NumObjectIdsAck
Semigroup) via (Sum Word16)
  deriving (Semigroup NumObjectIdsAck
NumObjectIdsAck
Semigroup NumObjectIdsAck =>
NumObjectIdsAck
-> (NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck)
-> ([NumObjectIdsAck] -> NumObjectIdsAck)
-> Monoid NumObjectIdsAck
[NumObjectIdsAck] -> NumObjectIdsAck
NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
$cmempty :: NumObjectIdsAck
mempty :: NumObjectIdsAck
$cmappend :: NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
mappend :: NumObjectIdsAck -> NumObjectIdsAck -> NumObjectIdsAck
$cmconcat :: [NumObjectIdsAck] -> NumObjectIdsAck
mconcat :: [NumObjectIdsAck] -> NumObjectIdsAck
Monoid)    via (Sum Word16)
  deriving (Int -> NumObjectIdsAck -> ShowS
[NumObjectIdsAck] -> ShowS
NumObjectIdsAck -> String
(Int -> NumObjectIdsAck -> ShowS)
-> (NumObjectIdsAck -> String)
-> ([NumObjectIdsAck] -> ShowS)
-> Show NumObjectIdsAck
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> NumObjectIdsAck -> ShowS
showsPrec :: Int -> NumObjectIdsAck -> ShowS
$cshow :: NumObjectIdsAck -> String
show :: NumObjectIdsAck -> String
$cshowList :: [NumObjectIdsAck] -> ShowS
showList :: [NumObjectIdsAck] -> ShowS
Show)      via (Quiet NumObjectIdsAck)

newtype NumObjectIdsReq = NumObjectIdsReq {NumObjectIdsReq -> Word16
getNumObjectIdsReq :: Word16}
  deriving (NumObjectIdsReq -> NumObjectIdsReq -> Bool
(NumObjectIdsReq -> NumObjectIdsReq -> Bool)
-> (NumObjectIdsReq -> NumObjectIdsReq -> Bool)
-> Eq NumObjectIdsReq
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: NumObjectIdsReq -> NumObjectIdsReq -> Bool
== :: NumObjectIdsReq -> NumObjectIdsReq -> Bool
$c/= :: NumObjectIdsReq -> NumObjectIdsReq -> Bool
/= :: NumObjectIdsReq -> NumObjectIdsReq -> Bool
Eq, Eq NumObjectIdsReq
Eq NumObjectIdsReq =>
(NumObjectIdsReq -> NumObjectIdsReq -> Ordering)
-> (NumObjectIdsReq -> NumObjectIdsReq -> Bool)
-> (NumObjectIdsReq -> NumObjectIdsReq -> Bool)
-> (NumObjectIdsReq -> NumObjectIdsReq -> Bool)
-> (NumObjectIdsReq -> NumObjectIdsReq -> Bool)
-> (NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq)
-> (NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq)
-> Ord NumObjectIdsReq
NumObjectIdsReq -> NumObjectIdsReq -> Bool
NumObjectIdsReq -> NumObjectIdsReq -> Ordering
NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: NumObjectIdsReq -> NumObjectIdsReq -> Ordering
compare :: NumObjectIdsReq -> NumObjectIdsReq -> Ordering
$c< :: NumObjectIdsReq -> NumObjectIdsReq -> Bool
< :: NumObjectIdsReq -> NumObjectIdsReq -> Bool
$c<= :: NumObjectIdsReq -> NumObjectIdsReq -> Bool
<= :: NumObjectIdsReq -> NumObjectIdsReq -> Bool
$c> :: NumObjectIdsReq -> NumObjectIdsReq -> Bool
> :: NumObjectIdsReq -> NumObjectIdsReq -> Bool
$c>= :: NumObjectIdsReq -> NumObjectIdsReq -> Bool
>= :: NumObjectIdsReq -> NumObjectIdsReq -> Bool
$cmax :: NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
max :: NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
$cmin :: NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
min :: NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
Ord, NumObjectIdsReq -> ()
(NumObjectIdsReq -> ()) -> NFData NumObjectIdsReq
forall a. (a -> ()) -> NFData a
$crnf :: NumObjectIdsReq -> ()
rnf :: NumObjectIdsReq -> ()
NFData, (forall x. NumObjectIdsReq -> Rep NumObjectIdsReq x)
-> (forall x. Rep NumObjectIdsReq x -> NumObjectIdsReq)
-> Generic NumObjectIdsReq
forall x. Rep NumObjectIdsReq x -> NumObjectIdsReq
forall x. NumObjectIdsReq -> Rep NumObjectIdsReq x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. NumObjectIdsReq -> Rep NumObjectIdsReq x
from :: forall x. NumObjectIdsReq -> Rep NumObjectIdsReq x
$cto :: forall x. Rep NumObjectIdsReq x -> NumObjectIdsReq
to :: forall x. Rep NumObjectIdsReq x -> NumObjectIdsReq
Generic)
  deriving newtype (Integer -> NumObjectIdsReq
NumObjectIdsReq -> NumObjectIdsReq
NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
(NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq)
-> (NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq)
-> (NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq)
-> (NumObjectIdsReq -> NumObjectIdsReq)
-> (NumObjectIdsReq -> NumObjectIdsReq)
-> (NumObjectIdsReq -> NumObjectIdsReq)
-> (Integer -> NumObjectIdsReq)
-> Num NumObjectIdsReq
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
$c+ :: NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
+ :: NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
$c- :: NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
- :: NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
$c* :: NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
* :: NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
$cnegate :: NumObjectIdsReq -> NumObjectIdsReq
negate :: NumObjectIdsReq -> NumObjectIdsReq
$cabs :: NumObjectIdsReq -> NumObjectIdsReq
abs :: NumObjectIdsReq -> NumObjectIdsReq
$csignum :: NumObjectIdsReq -> NumObjectIdsReq
signum :: NumObjectIdsReq -> NumObjectIdsReq
$cfromInteger :: Integer -> NumObjectIdsReq
fromInteger :: Integer -> NumObjectIdsReq
Num, Int -> NumObjectIdsReq
NumObjectIdsReq -> Int
NumObjectIdsReq -> [NumObjectIdsReq]
NumObjectIdsReq -> NumObjectIdsReq
NumObjectIdsReq -> NumObjectIdsReq -> [NumObjectIdsReq]
NumObjectIdsReq
-> NumObjectIdsReq -> NumObjectIdsReq -> [NumObjectIdsReq]
(NumObjectIdsReq -> NumObjectIdsReq)
-> (NumObjectIdsReq -> NumObjectIdsReq)
-> (Int -> NumObjectIdsReq)
-> (NumObjectIdsReq -> Int)
-> (NumObjectIdsReq -> [NumObjectIdsReq])
-> (NumObjectIdsReq -> NumObjectIdsReq -> [NumObjectIdsReq])
-> (NumObjectIdsReq -> NumObjectIdsReq -> [NumObjectIdsReq])
-> (NumObjectIdsReq
    -> NumObjectIdsReq -> NumObjectIdsReq -> [NumObjectIdsReq])
-> Enum NumObjectIdsReq
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: NumObjectIdsReq -> NumObjectIdsReq
succ :: NumObjectIdsReq -> NumObjectIdsReq
$cpred :: NumObjectIdsReq -> NumObjectIdsReq
pred :: NumObjectIdsReq -> NumObjectIdsReq
$ctoEnum :: Int -> NumObjectIdsReq
toEnum :: Int -> NumObjectIdsReq
$cfromEnum :: NumObjectIdsReq -> Int
fromEnum :: NumObjectIdsReq -> Int
$cenumFrom :: NumObjectIdsReq -> [NumObjectIdsReq]
enumFrom :: NumObjectIdsReq -> [NumObjectIdsReq]
$cenumFromThen :: NumObjectIdsReq -> NumObjectIdsReq -> [NumObjectIdsReq]
enumFromThen :: NumObjectIdsReq -> NumObjectIdsReq -> [NumObjectIdsReq]
$cenumFromTo :: NumObjectIdsReq -> NumObjectIdsReq -> [NumObjectIdsReq]
enumFromTo :: NumObjectIdsReq -> NumObjectIdsReq -> [NumObjectIdsReq]
$cenumFromThenTo :: NumObjectIdsReq
-> NumObjectIdsReq -> NumObjectIdsReq -> [NumObjectIdsReq]
enumFromThenTo :: NumObjectIdsReq
-> NumObjectIdsReq -> NumObjectIdsReq -> [NumObjectIdsReq]
Enum, Num NumObjectIdsReq
Ord NumObjectIdsReq
(Num NumObjectIdsReq, Ord NumObjectIdsReq) =>
(NumObjectIdsReq -> Rational) -> Real NumObjectIdsReq
NumObjectIdsReq -> Rational
forall a. (Num a, Ord a) => (a -> Rational) -> Real a
$ctoRational :: NumObjectIdsReq -> Rational
toRational :: NumObjectIdsReq -> Rational
Real, Enum NumObjectIdsReq
Real NumObjectIdsReq
(Real NumObjectIdsReq, Enum NumObjectIdsReq) =>
(NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq)
-> (NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq)
-> (NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq)
-> (NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq)
-> (NumObjectIdsReq
    -> NumObjectIdsReq -> (NumObjectIdsReq, NumObjectIdsReq))
-> (NumObjectIdsReq
    -> NumObjectIdsReq -> (NumObjectIdsReq, NumObjectIdsReq))
-> (NumObjectIdsReq -> Integer)
-> Integral NumObjectIdsReq
NumObjectIdsReq -> Integer
NumObjectIdsReq
-> NumObjectIdsReq -> (NumObjectIdsReq, NumObjectIdsReq)
NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
forall a.
(Real a, Enum a) =>
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> (a, a))
-> (a -> a -> (a, a))
-> (a -> Integer)
-> Integral a
$cquot :: NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
quot :: NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
$crem :: NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
rem :: NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
$cdiv :: NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
div :: NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
$cmod :: NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
mod :: NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
$cquotRem :: NumObjectIdsReq
-> NumObjectIdsReq -> (NumObjectIdsReq, NumObjectIdsReq)
quotRem :: NumObjectIdsReq
-> NumObjectIdsReq -> (NumObjectIdsReq, NumObjectIdsReq)
$cdivMod :: NumObjectIdsReq
-> NumObjectIdsReq -> (NumObjectIdsReq, NumObjectIdsReq)
divMod :: NumObjectIdsReq
-> NumObjectIdsReq -> (NumObjectIdsReq, NumObjectIdsReq)
$ctoInteger :: NumObjectIdsReq -> Integer
toInteger :: NumObjectIdsReq -> Integer
Integral, NumObjectIdsReq
NumObjectIdsReq -> NumObjectIdsReq -> Bounded NumObjectIdsReq
forall a. a -> a -> Bounded a
$cminBound :: NumObjectIdsReq
minBound :: NumObjectIdsReq
$cmaxBound :: NumObjectIdsReq
maxBound :: NumObjectIdsReq
Bounded, [String] -> NumObjectIdsReq -> IO (Maybe ThunkInfo)
Proxy NumObjectIdsReq -> String
([String] -> NumObjectIdsReq -> IO (Maybe ThunkInfo))
-> ([String] -> NumObjectIdsReq -> IO (Maybe ThunkInfo))
-> (Proxy NumObjectIdsReq -> String)
-> NoThunks NumObjectIdsReq
forall a.
([String] -> a -> IO (Maybe ThunkInfo))
-> ([String] -> a -> IO (Maybe ThunkInfo))
-> (Proxy a -> String)
-> NoThunks a
$cnoThunks :: [String] -> NumObjectIdsReq -> IO (Maybe ThunkInfo)
noThunks :: [String] -> NumObjectIdsReq -> IO (Maybe ThunkInfo)
$cwNoThunks :: [String] -> NumObjectIdsReq -> IO (Maybe ThunkInfo)
wNoThunks :: [String] -> NumObjectIdsReq -> IO (Maybe ThunkInfo)
$cshowTypeOf :: Proxy NumObjectIdsReq -> String
showTypeOf :: Proxy NumObjectIdsReq -> String
NoThunks)
  deriving (NonEmpty NumObjectIdsReq -> NumObjectIdsReq
NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
(NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq)
-> (NonEmpty NumObjectIdsReq -> NumObjectIdsReq)
-> (forall b.
    Integral b =>
    b -> NumObjectIdsReq -> NumObjectIdsReq)
-> Semigroup NumObjectIdsReq
forall b. Integral b => b -> NumObjectIdsReq -> NumObjectIdsReq
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
$c<> :: NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
<> :: NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
$csconcat :: NonEmpty NumObjectIdsReq -> NumObjectIdsReq
sconcat :: NonEmpty NumObjectIdsReq -> NumObjectIdsReq
$cstimes :: forall b. Integral b => b -> NumObjectIdsReq -> NumObjectIdsReq
stimes :: forall b. Integral b => b -> NumObjectIdsReq -> NumObjectIdsReq
Semigroup) via (Sum Word16)
  deriving (Semigroup NumObjectIdsReq
NumObjectIdsReq
Semigroup NumObjectIdsReq =>
NumObjectIdsReq
-> (NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq)
-> ([NumObjectIdsReq] -> NumObjectIdsReq)
-> Monoid NumObjectIdsReq
[NumObjectIdsReq] -> NumObjectIdsReq
NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
$cmempty :: NumObjectIdsReq
mempty :: NumObjectIdsReq
$cmappend :: NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
mappend :: NumObjectIdsReq -> NumObjectIdsReq -> NumObjectIdsReq
$cmconcat :: [NumObjectIdsReq] -> NumObjectIdsReq
mconcat :: [NumObjectIdsReq] -> NumObjectIdsReq
Monoid)    via (Sum Word16)
  deriving (Int -> NumObjectIdsReq -> ShowS
[NumObjectIdsReq] -> ShowS
NumObjectIdsReq -> String
(Int -> NumObjectIdsReq -> ShowS)
-> (NumObjectIdsReq -> String)
-> ([NumObjectIdsReq] -> ShowS)
-> Show NumObjectIdsReq
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> NumObjectIdsReq -> ShowS
showsPrec :: Int -> NumObjectIdsReq -> ShowS
$cshow :: NumObjectIdsReq -> String
show :: NumObjectIdsReq -> String
$cshowList :: [NumObjectIdsReq] -> ShowS
showList :: [NumObjectIdsReq] -> ShowS
Show)      via (Quiet NumObjectIdsReq)

newtype NumObjectsReq = NumObjectsReq {NumObjectsReq -> Word16
getNumObjectsReq :: Word16}
  deriving (NumObjectsReq -> NumObjectsReq -> Bool
(NumObjectsReq -> NumObjectsReq -> Bool)
-> (NumObjectsReq -> NumObjectsReq -> Bool) -> Eq NumObjectsReq
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: NumObjectsReq -> NumObjectsReq -> Bool
== :: NumObjectsReq -> NumObjectsReq -> Bool
$c/= :: NumObjectsReq -> NumObjectsReq -> Bool
/= :: NumObjectsReq -> NumObjectsReq -> Bool
Eq, Eq NumObjectsReq
Eq NumObjectsReq =>
(NumObjectsReq -> NumObjectsReq -> Ordering)
-> (NumObjectsReq -> NumObjectsReq -> Bool)
-> (NumObjectsReq -> NumObjectsReq -> Bool)
-> (NumObjectsReq -> NumObjectsReq -> Bool)
-> (NumObjectsReq -> NumObjectsReq -> Bool)
-> (NumObjectsReq -> NumObjectsReq -> NumObjectsReq)
-> (NumObjectsReq -> NumObjectsReq -> NumObjectsReq)
-> Ord NumObjectsReq
NumObjectsReq -> NumObjectsReq -> Bool
NumObjectsReq -> NumObjectsReq -> Ordering
NumObjectsReq -> NumObjectsReq -> NumObjectsReq
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: NumObjectsReq -> NumObjectsReq -> Ordering
compare :: NumObjectsReq -> NumObjectsReq -> Ordering
$c< :: NumObjectsReq -> NumObjectsReq -> Bool
< :: NumObjectsReq -> NumObjectsReq -> Bool
$c<= :: NumObjectsReq -> NumObjectsReq -> Bool
<= :: NumObjectsReq -> NumObjectsReq -> Bool
$c> :: NumObjectsReq -> NumObjectsReq -> Bool
> :: NumObjectsReq -> NumObjectsReq -> Bool
$c>= :: NumObjectsReq -> NumObjectsReq -> Bool
>= :: NumObjectsReq -> NumObjectsReq -> Bool
$cmax :: NumObjectsReq -> NumObjectsReq -> NumObjectsReq
max :: NumObjectsReq -> NumObjectsReq -> NumObjectsReq
$cmin :: NumObjectsReq -> NumObjectsReq -> NumObjectsReq
min :: NumObjectsReq -> NumObjectsReq -> NumObjectsReq
Ord, NumObjectsReq -> ()
(NumObjectsReq -> ()) -> NFData NumObjectsReq
forall a. (a -> ()) -> NFData a
$crnf :: NumObjectsReq -> ()
rnf :: NumObjectsReq -> ()
NFData, (forall x. NumObjectsReq -> Rep NumObjectsReq x)
-> (forall x. Rep NumObjectsReq x -> NumObjectsReq)
-> Generic NumObjectsReq
forall x. Rep NumObjectsReq x -> NumObjectsReq
forall x. NumObjectsReq -> Rep NumObjectsReq x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. NumObjectsReq -> Rep NumObjectsReq x
from :: forall x. NumObjectsReq -> Rep NumObjectsReq x
$cto :: forall x. Rep NumObjectsReq x -> NumObjectsReq
to :: forall x. Rep NumObjectsReq x -> NumObjectsReq
Generic)
  deriving newtype (Integer -> NumObjectsReq
NumObjectsReq -> NumObjectsReq
NumObjectsReq -> NumObjectsReq -> NumObjectsReq
(NumObjectsReq -> NumObjectsReq -> NumObjectsReq)
-> (NumObjectsReq -> NumObjectsReq -> NumObjectsReq)
-> (NumObjectsReq -> NumObjectsReq -> NumObjectsReq)
-> (NumObjectsReq -> NumObjectsReq)
-> (NumObjectsReq -> NumObjectsReq)
-> (NumObjectsReq -> NumObjectsReq)
-> (Integer -> NumObjectsReq)
-> Num NumObjectsReq
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
$c+ :: NumObjectsReq -> NumObjectsReq -> NumObjectsReq
+ :: NumObjectsReq -> NumObjectsReq -> NumObjectsReq
$c- :: NumObjectsReq -> NumObjectsReq -> NumObjectsReq
- :: NumObjectsReq -> NumObjectsReq -> NumObjectsReq
$c* :: NumObjectsReq -> NumObjectsReq -> NumObjectsReq
* :: NumObjectsReq -> NumObjectsReq -> NumObjectsReq
$cnegate :: NumObjectsReq -> NumObjectsReq
negate :: NumObjectsReq -> NumObjectsReq
$cabs :: NumObjectsReq -> NumObjectsReq
abs :: NumObjectsReq -> NumObjectsReq
$csignum :: NumObjectsReq -> NumObjectsReq
signum :: NumObjectsReq -> NumObjectsReq
$cfromInteger :: Integer -> NumObjectsReq
fromInteger :: Integer -> NumObjectsReq
Num, Int -> NumObjectsReq
NumObjectsReq -> Int
NumObjectsReq -> [NumObjectsReq]
NumObjectsReq -> NumObjectsReq
NumObjectsReq -> NumObjectsReq -> [NumObjectsReq]
NumObjectsReq -> NumObjectsReq -> NumObjectsReq -> [NumObjectsReq]
(NumObjectsReq -> NumObjectsReq)
-> (NumObjectsReq -> NumObjectsReq)
-> (Int -> NumObjectsReq)
-> (NumObjectsReq -> Int)
-> (NumObjectsReq -> [NumObjectsReq])
-> (NumObjectsReq -> NumObjectsReq -> [NumObjectsReq])
-> (NumObjectsReq -> NumObjectsReq -> [NumObjectsReq])
-> (NumObjectsReq
    -> NumObjectsReq -> NumObjectsReq -> [NumObjectsReq])
-> Enum NumObjectsReq
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: NumObjectsReq -> NumObjectsReq
succ :: NumObjectsReq -> NumObjectsReq
$cpred :: NumObjectsReq -> NumObjectsReq
pred :: NumObjectsReq -> NumObjectsReq
$ctoEnum :: Int -> NumObjectsReq
toEnum :: Int -> NumObjectsReq
$cfromEnum :: NumObjectsReq -> Int
fromEnum :: NumObjectsReq -> Int
$cenumFrom :: NumObjectsReq -> [NumObjectsReq]
enumFrom :: NumObjectsReq -> [NumObjectsReq]
$cenumFromThen :: NumObjectsReq -> NumObjectsReq -> [NumObjectsReq]
enumFromThen :: NumObjectsReq -> NumObjectsReq -> [NumObjectsReq]
$cenumFromTo :: NumObjectsReq -> NumObjectsReq -> [NumObjectsReq]
enumFromTo :: NumObjectsReq -> NumObjectsReq -> [NumObjectsReq]
$cenumFromThenTo :: NumObjectsReq -> NumObjectsReq -> NumObjectsReq -> [NumObjectsReq]
enumFromThenTo :: NumObjectsReq -> NumObjectsReq -> NumObjectsReq -> [NumObjectsReq]
Enum, Num NumObjectsReq
Ord NumObjectsReq
(Num NumObjectsReq, Ord NumObjectsReq) =>
(NumObjectsReq -> Rational) -> Real NumObjectsReq
NumObjectsReq -> Rational
forall a. (Num a, Ord a) => (a -> Rational) -> Real a
$ctoRational :: NumObjectsReq -> Rational
toRational :: NumObjectsReq -> Rational
Real, Enum NumObjectsReq
Real NumObjectsReq
(Real NumObjectsReq, Enum NumObjectsReq) =>
(NumObjectsReq -> NumObjectsReq -> NumObjectsReq)
-> (NumObjectsReq -> NumObjectsReq -> NumObjectsReq)
-> (NumObjectsReq -> NumObjectsReq -> NumObjectsReq)
-> (NumObjectsReq -> NumObjectsReq -> NumObjectsReq)
-> (NumObjectsReq
    -> NumObjectsReq -> (NumObjectsReq, NumObjectsReq))
-> (NumObjectsReq
    -> NumObjectsReq -> (NumObjectsReq, NumObjectsReq))
-> (NumObjectsReq -> Integer)
-> Integral NumObjectsReq
NumObjectsReq -> Integer
NumObjectsReq -> NumObjectsReq -> (NumObjectsReq, NumObjectsReq)
NumObjectsReq -> NumObjectsReq -> NumObjectsReq
forall a.
(Real a, Enum a) =>
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> (a, a))
-> (a -> a -> (a, a))
-> (a -> Integer)
-> Integral a
$cquot :: NumObjectsReq -> NumObjectsReq -> NumObjectsReq
quot :: NumObjectsReq -> NumObjectsReq -> NumObjectsReq
$crem :: NumObjectsReq -> NumObjectsReq -> NumObjectsReq
rem :: NumObjectsReq -> NumObjectsReq -> NumObjectsReq
$cdiv :: NumObjectsReq -> NumObjectsReq -> NumObjectsReq
div :: NumObjectsReq -> NumObjectsReq -> NumObjectsReq
$cmod :: NumObjectsReq -> NumObjectsReq -> NumObjectsReq
mod :: NumObjectsReq -> NumObjectsReq -> NumObjectsReq
$cquotRem :: NumObjectsReq -> NumObjectsReq -> (NumObjectsReq, NumObjectsReq)
quotRem :: NumObjectsReq -> NumObjectsReq -> (NumObjectsReq, NumObjectsReq)
$cdivMod :: NumObjectsReq -> NumObjectsReq -> (NumObjectsReq, NumObjectsReq)
divMod :: NumObjectsReq -> NumObjectsReq -> (NumObjectsReq, NumObjectsReq)
$ctoInteger :: NumObjectsReq -> Integer
toInteger :: NumObjectsReq -> Integer
Integral, NumObjectsReq
NumObjectsReq -> NumObjectsReq -> Bounded NumObjectsReq
forall a. a -> a -> Bounded a
$cminBound :: NumObjectsReq
minBound :: NumObjectsReq
$cmaxBound :: NumObjectsReq
maxBound :: NumObjectsReq
Bounded, [String] -> NumObjectsReq -> IO (Maybe ThunkInfo)
Proxy NumObjectsReq -> String
([String] -> NumObjectsReq -> IO (Maybe ThunkInfo))
-> ([String] -> NumObjectsReq -> IO (Maybe ThunkInfo))
-> (Proxy NumObjectsReq -> String)
-> NoThunks NumObjectsReq
forall a.
([String] -> a -> IO (Maybe ThunkInfo))
-> ([String] -> a -> IO (Maybe ThunkInfo))
-> (Proxy a -> String)
-> NoThunks a
$cnoThunks :: [String] -> NumObjectsReq -> IO (Maybe ThunkInfo)
noThunks :: [String] -> NumObjectsReq -> IO (Maybe ThunkInfo)
$cwNoThunks :: [String] -> NumObjectsReq -> IO (Maybe ThunkInfo)
wNoThunks :: [String] -> NumObjectsReq -> IO (Maybe ThunkInfo)
$cshowTypeOf :: Proxy NumObjectsReq -> String
showTypeOf :: Proxy NumObjectsReq -> String
NoThunks)
  deriving (NonEmpty NumObjectsReq -> NumObjectsReq
NumObjectsReq -> NumObjectsReq -> NumObjectsReq
(NumObjectsReq -> NumObjectsReq -> NumObjectsReq)
-> (NonEmpty NumObjectsReq -> NumObjectsReq)
-> (forall b. Integral b => b -> NumObjectsReq -> NumObjectsReq)
-> Semigroup NumObjectsReq
forall b. Integral b => b -> NumObjectsReq -> NumObjectsReq
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
$c<> :: NumObjectsReq -> NumObjectsReq -> NumObjectsReq
<> :: NumObjectsReq -> NumObjectsReq -> NumObjectsReq
$csconcat :: NonEmpty NumObjectsReq -> NumObjectsReq
sconcat :: NonEmpty NumObjectsReq -> NumObjectsReq
$cstimes :: forall b. Integral b => b -> NumObjectsReq -> NumObjectsReq
stimes :: forall b. Integral b => b -> NumObjectsReq -> NumObjectsReq
Semigroup) via (Sum Word16)
  deriving (Semigroup NumObjectsReq
NumObjectsReq
Semigroup NumObjectsReq =>
NumObjectsReq
-> (NumObjectsReq -> NumObjectsReq -> NumObjectsReq)
-> ([NumObjectsReq] -> NumObjectsReq)
-> Monoid NumObjectsReq
[NumObjectsReq] -> NumObjectsReq
NumObjectsReq -> NumObjectsReq -> NumObjectsReq
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
$cmempty :: NumObjectsReq
mempty :: NumObjectsReq
$cmappend :: NumObjectsReq -> NumObjectsReq -> NumObjectsReq
mappend :: NumObjectsReq -> NumObjectsReq -> NumObjectsReq
$cmconcat :: [NumObjectsReq] -> NumObjectsReq
mconcat :: [NumObjectsReq] -> NumObjectsReq
Monoid)    via (Sum Word16)
  deriving (Int -> NumObjectsReq -> ShowS
[NumObjectsReq] -> ShowS
NumObjectsReq -> String
(Int -> NumObjectsReq -> ShowS)
-> (NumObjectsReq -> String)
-> ([NumObjectsReq] -> ShowS)
-> Show NumObjectsReq
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> NumObjectsReq -> ShowS
showsPrec :: Int -> NumObjectsReq -> ShowS
$cshow :: NumObjectsReq -> String
show :: NumObjectsReq -> String
$cshowList :: [NumObjectsReq] -> ShowS
showList :: [NumObjectsReq] -> ShowS
Show)      via (Quiet NumObjectsReq)

newtype NumObjectsUnacknowledged = NumObjectsUnacknowledged {NumObjectsUnacknowledged -> Word16
getNumObjectsUnacknowledged :: Word16}
  deriving (NumObjectsUnacknowledged -> NumObjectsUnacknowledged -> Bool
(NumObjectsUnacknowledged -> NumObjectsUnacknowledged -> Bool)
-> (NumObjectsUnacknowledged -> NumObjectsUnacknowledged -> Bool)
-> Eq NumObjectsUnacknowledged
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: NumObjectsUnacknowledged -> NumObjectsUnacknowledged -> Bool
== :: NumObjectsUnacknowledged -> NumObjectsUnacknowledged -> Bool
$c/= :: NumObjectsUnacknowledged -> NumObjectsUnacknowledged -> Bool
/= :: NumObjectsUnacknowledged -> NumObjectsUnacknowledged -> Bool
Eq, Eq NumObjectsUnacknowledged
Eq NumObjectsUnacknowledged =>
(NumObjectsUnacknowledged -> NumObjectsUnacknowledged -> Ordering)
-> (NumObjectsUnacknowledged -> NumObjectsUnacknowledged -> Bool)
-> (NumObjectsUnacknowledged -> NumObjectsUnacknowledged -> Bool)
-> (NumObjectsUnacknowledged -> NumObjectsUnacknowledged -> Bool)
-> (NumObjectsUnacknowledged -> NumObjectsUnacknowledged -> Bool)
-> (NumObjectsUnacknowledged
    -> NumObjectsUnacknowledged -> NumObjectsUnacknowledged)
-> (NumObjectsUnacknowledged
    -> NumObjectsUnacknowledged -> NumObjectsUnacknowledged)
-> Ord NumObjectsUnacknowledged
NumObjectsUnacknowledged -> NumObjectsUnacknowledged -> Bool
NumObjectsUnacknowledged -> NumObjectsUnacknowledged -> Ordering
NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: NumObjectsUnacknowledged -> NumObjectsUnacknowledged -> Ordering
compare :: NumObjectsUnacknowledged -> NumObjectsUnacknowledged -> Ordering
$c< :: NumObjectsUnacknowledged -> NumObjectsUnacknowledged -> Bool
< :: NumObjectsUnacknowledged -> NumObjectsUnacknowledged -> Bool
$c<= :: NumObjectsUnacknowledged -> NumObjectsUnacknowledged -> Bool
<= :: NumObjectsUnacknowledged -> NumObjectsUnacknowledged -> Bool
$c> :: NumObjectsUnacknowledged -> NumObjectsUnacknowledged -> Bool
> :: NumObjectsUnacknowledged -> NumObjectsUnacknowledged -> Bool
$c>= :: NumObjectsUnacknowledged -> NumObjectsUnacknowledged -> Bool
>= :: NumObjectsUnacknowledged -> NumObjectsUnacknowledged -> Bool
$cmax :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
max :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
$cmin :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
min :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
Ord, NumObjectsUnacknowledged -> ()
(NumObjectsUnacknowledged -> ()) -> NFData NumObjectsUnacknowledged
forall a. (a -> ()) -> NFData a
$crnf :: NumObjectsUnacknowledged -> ()
rnf :: NumObjectsUnacknowledged -> ()
NFData, (forall x.
 NumObjectsUnacknowledged -> Rep NumObjectsUnacknowledged x)
-> (forall x.
    Rep NumObjectsUnacknowledged x -> NumObjectsUnacknowledged)
-> Generic NumObjectsUnacknowledged
forall x.
Rep NumObjectsUnacknowledged x -> NumObjectsUnacknowledged
forall x.
NumObjectsUnacknowledged -> Rep NumObjectsUnacknowledged x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x.
NumObjectsUnacknowledged -> Rep NumObjectsUnacknowledged x
from :: forall x.
NumObjectsUnacknowledged -> Rep NumObjectsUnacknowledged x
$cto :: forall x.
Rep NumObjectsUnacknowledged x -> NumObjectsUnacknowledged
to :: forall x.
Rep NumObjectsUnacknowledged x -> NumObjectsUnacknowledged
Generic)
  deriving newtype (Integer -> NumObjectsUnacknowledged
NumObjectsUnacknowledged -> NumObjectsUnacknowledged
NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
(NumObjectsUnacknowledged
 -> NumObjectsUnacknowledged -> NumObjectsUnacknowledged)
-> (NumObjectsUnacknowledged
    -> NumObjectsUnacknowledged -> NumObjectsUnacknowledged)
-> (NumObjectsUnacknowledged
    -> NumObjectsUnacknowledged -> NumObjectsUnacknowledged)
-> (NumObjectsUnacknowledged -> NumObjectsUnacknowledged)
-> (NumObjectsUnacknowledged -> NumObjectsUnacknowledged)
-> (NumObjectsUnacknowledged -> NumObjectsUnacknowledged)
-> (Integer -> NumObjectsUnacknowledged)
-> Num NumObjectsUnacknowledged
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
$c+ :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
+ :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
$c- :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
- :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
$c* :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
* :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
$cnegate :: NumObjectsUnacknowledged -> NumObjectsUnacknowledged
negate :: NumObjectsUnacknowledged -> NumObjectsUnacknowledged
$cabs :: NumObjectsUnacknowledged -> NumObjectsUnacknowledged
abs :: NumObjectsUnacknowledged -> NumObjectsUnacknowledged
$csignum :: NumObjectsUnacknowledged -> NumObjectsUnacknowledged
signum :: NumObjectsUnacknowledged -> NumObjectsUnacknowledged
$cfromInteger :: Integer -> NumObjectsUnacknowledged
fromInteger :: Integer -> NumObjectsUnacknowledged
Num, Int -> NumObjectsUnacknowledged
NumObjectsUnacknowledged -> Int
NumObjectsUnacknowledged -> [NumObjectsUnacknowledged]
NumObjectsUnacknowledged -> NumObjectsUnacknowledged
NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> [NumObjectsUnacknowledged]
NumObjectsUnacknowledged
-> NumObjectsUnacknowledged
-> NumObjectsUnacknowledged
-> [NumObjectsUnacknowledged]
(NumObjectsUnacknowledged -> NumObjectsUnacknowledged)
-> (NumObjectsUnacknowledged -> NumObjectsUnacknowledged)
-> (Int -> NumObjectsUnacknowledged)
-> (NumObjectsUnacknowledged -> Int)
-> (NumObjectsUnacknowledged -> [NumObjectsUnacknowledged])
-> (NumObjectsUnacknowledged
    -> NumObjectsUnacknowledged -> [NumObjectsUnacknowledged])
-> (NumObjectsUnacknowledged
    -> NumObjectsUnacknowledged -> [NumObjectsUnacknowledged])
-> (NumObjectsUnacknowledged
    -> NumObjectsUnacknowledged
    -> NumObjectsUnacknowledged
    -> [NumObjectsUnacknowledged])
-> Enum NumObjectsUnacknowledged
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: NumObjectsUnacknowledged -> NumObjectsUnacknowledged
succ :: NumObjectsUnacknowledged -> NumObjectsUnacknowledged
$cpred :: NumObjectsUnacknowledged -> NumObjectsUnacknowledged
pred :: NumObjectsUnacknowledged -> NumObjectsUnacknowledged
$ctoEnum :: Int -> NumObjectsUnacknowledged
toEnum :: Int -> NumObjectsUnacknowledged
$cfromEnum :: NumObjectsUnacknowledged -> Int
fromEnum :: NumObjectsUnacknowledged -> Int
$cenumFrom :: NumObjectsUnacknowledged -> [NumObjectsUnacknowledged]
enumFrom :: NumObjectsUnacknowledged -> [NumObjectsUnacknowledged]
$cenumFromThen :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> [NumObjectsUnacknowledged]
enumFromThen :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> [NumObjectsUnacknowledged]
$cenumFromTo :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> [NumObjectsUnacknowledged]
enumFromTo :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> [NumObjectsUnacknowledged]
$cenumFromThenTo :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged
-> NumObjectsUnacknowledged
-> [NumObjectsUnacknowledged]
enumFromThenTo :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged
-> NumObjectsUnacknowledged
-> [NumObjectsUnacknowledged]
Enum, Num NumObjectsUnacknowledged
Ord NumObjectsUnacknowledged
(Num NumObjectsUnacknowledged, Ord NumObjectsUnacknowledged) =>
(NumObjectsUnacknowledged -> Rational)
-> Real NumObjectsUnacknowledged
NumObjectsUnacknowledged -> Rational
forall a. (Num a, Ord a) => (a -> Rational) -> Real a
$ctoRational :: NumObjectsUnacknowledged -> Rational
toRational :: NumObjectsUnacknowledged -> Rational
Real, Enum NumObjectsUnacknowledged
Real NumObjectsUnacknowledged
(Real NumObjectsUnacknowledged, Enum NumObjectsUnacknowledged) =>
(NumObjectsUnacknowledged
 -> NumObjectsUnacknowledged -> NumObjectsUnacknowledged)
-> (NumObjectsUnacknowledged
    -> NumObjectsUnacknowledged -> NumObjectsUnacknowledged)
-> (NumObjectsUnacknowledged
    -> NumObjectsUnacknowledged -> NumObjectsUnacknowledged)
-> (NumObjectsUnacknowledged
    -> NumObjectsUnacknowledged -> NumObjectsUnacknowledged)
-> (NumObjectsUnacknowledged
    -> NumObjectsUnacknowledged
    -> (NumObjectsUnacknowledged, NumObjectsUnacknowledged))
-> (NumObjectsUnacknowledged
    -> NumObjectsUnacknowledged
    -> (NumObjectsUnacknowledged, NumObjectsUnacknowledged))
-> (NumObjectsUnacknowledged -> Integer)
-> Integral NumObjectsUnacknowledged
NumObjectsUnacknowledged -> Integer
NumObjectsUnacknowledged
-> NumObjectsUnacknowledged
-> (NumObjectsUnacknowledged, NumObjectsUnacknowledged)
NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
forall a.
(Real a, Enum a) =>
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> (a, a))
-> (a -> a -> (a, a))
-> (a -> Integer)
-> Integral a
$cquot :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
quot :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
$crem :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
rem :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
$cdiv :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
div :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
$cmod :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
mod :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
$cquotRem :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged
-> (NumObjectsUnacknowledged, NumObjectsUnacknowledged)
quotRem :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged
-> (NumObjectsUnacknowledged, NumObjectsUnacknowledged)
$cdivMod :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged
-> (NumObjectsUnacknowledged, NumObjectsUnacknowledged)
divMod :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged
-> (NumObjectsUnacknowledged, NumObjectsUnacknowledged)
$ctoInteger :: NumObjectsUnacknowledged -> Integer
toInteger :: NumObjectsUnacknowledged -> Integer
Integral, NumObjectsUnacknowledged
NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> Bounded NumObjectsUnacknowledged
forall a. a -> a -> Bounded a
$cminBound :: NumObjectsUnacknowledged
minBound :: NumObjectsUnacknowledged
$cmaxBound :: NumObjectsUnacknowledged
maxBound :: NumObjectsUnacknowledged
Bounded, [String] -> NumObjectsUnacknowledged -> IO (Maybe ThunkInfo)
Proxy NumObjectsUnacknowledged -> String
([String] -> NumObjectsUnacknowledged -> IO (Maybe ThunkInfo))
-> ([String] -> NumObjectsUnacknowledged -> IO (Maybe ThunkInfo))
-> (Proxy NumObjectsUnacknowledged -> String)
-> NoThunks NumObjectsUnacknowledged
forall a.
([String] -> a -> IO (Maybe ThunkInfo))
-> ([String] -> a -> IO (Maybe ThunkInfo))
-> (Proxy a -> String)
-> NoThunks a
$cnoThunks :: [String] -> NumObjectsUnacknowledged -> IO (Maybe ThunkInfo)
noThunks :: [String] -> NumObjectsUnacknowledged -> IO (Maybe ThunkInfo)
$cwNoThunks :: [String] -> NumObjectsUnacknowledged -> IO (Maybe ThunkInfo)
wNoThunks :: [String] -> NumObjectsUnacknowledged -> IO (Maybe ThunkInfo)
$cshowTypeOf :: Proxy NumObjectsUnacknowledged -> String
showTypeOf :: Proxy NumObjectsUnacknowledged -> String
NoThunks)
  deriving (NonEmpty NumObjectsUnacknowledged -> NumObjectsUnacknowledged
NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
(NumObjectsUnacknowledged
 -> NumObjectsUnacknowledged -> NumObjectsUnacknowledged)
-> (NonEmpty NumObjectsUnacknowledged -> NumObjectsUnacknowledged)
-> (forall b.
    Integral b =>
    b -> NumObjectsUnacknowledged -> NumObjectsUnacknowledged)
-> Semigroup NumObjectsUnacknowledged
forall b.
Integral b =>
b -> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
$c<> :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
<> :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
$csconcat :: NonEmpty NumObjectsUnacknowledged -> NumObjectsUnacknowledged
sconcat :: NonEmpty NumObjectsUnacknowledged -> NumObjectsUnacknowledged
$cstimes :: forall b.
Integral b =>
b -> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
stimes :: forall b.
Integral b =>
b -> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
Semigroup) via (Sum Word16)
  deriving (Semigroup NumObjectsUnacknowledged
NumObjectsUnacknowledged
Semigroup NumObjectsUnacknowledged =>
NumObjectsUnacknowledged
-> (NumObjectsUnacknowledged
    -> NumObjectsUnacknowledged -> NumObjectsUnacknowledged)
-> ([NumObjectsUnacknowledged] -> NumObjectsUnacknowledged)
-> Monoid NumObjectsUnacknowledged
[NumObjectsUnacknowledged] -> NumObjectsUnacknowledged
NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
$cmempty :: NumObjectsUnacknowledged
mempty :: NumObjectsUnacknowledged
$cmappend :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
mappend :: NumObjectsUnacknowledged
-> NumObjectsUnacknowledged -> NumObjectsUnacknowledged
$cmconcat :: [NumObjectsUnacknowledged] -> NumObjectsUnacknowledged
mconcat :: [NumObjectsUnacknowledged] -> NumObjectsUnacknowledged
Monoid)    via (Sum Word16)
  deriving (Int -> NumObjectsUnacknowledged -> ShowS
[NumObjectsUnacknowledged] -> ShowS
NumObjectsUnacknowledged -> String
(Int -> NumObjectsUnacknowledged -> ShowS)
-> (NumObjectsUnacknowledged -> String)
-> ([NumObjectsUnacknowledged] -> ShowS)
-> Show NumObjectsUnacknowledged
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> NumObjectsUnacknowledged -> ShowS
showsPrec :: Int -> NumObjectsUnacknowledged -> ShowS
$cshow :: NumObjectsUnacknowledged -> String
show :: NumObjectsUnacknowledged -> String
$cshowList :: [NumObjectsUnacknowledged] -> ShowS
showList :: [NumObjectsUnacknowledged] -> ShowS
Show)      via (Quiet NumObjectsUnacknowledged)


-- | There are some constraints of the protocol that are not captured in the
-- types of the messages, but are documented with the messages. Violation
-- of these constraints is also a protocol error. The constraints are intended
-- to ensure that implementations are able to work in bounded space.
instance Protocol (ObjectDiffusion objectId object) where
  -- | The messages in the object diffusion protocol.
  --
  -- In this protocol the consumer (inbound side, client role) always
  -- initiates and the producer (outbound side, server role) replies.
  -- This makes it a pull based protocol where the receiver manages the
  -- control flow.
  --
  -- The protocol involves asking for object identifiers, and then
  -- asking for objects corresponding to the identifiers of interest.
  --
  -- There are two ways to ask for object identifiers, blocking and
  -- non-blocking. They otherwise have the same semantics.
  --
  -- The protocol maintains a notional FIFO of "outstanding" object
  -- identifiers that have been provided but not yet acknowledged. Only
  -- objects that are outstanding can be requested: they can be
  -- requested in any order, but at most once. Object identifiers are
  -- acknowledged in the same FIFO order they were provided in. The
  -- acknowledgement is included in the same messages used to ask for more
  -- object identifiers.
  data Message (ObjectDiffusion objectId object) from to where

    -- | Initial message.
    -- Unlike in TxSubmission, this message doesn't change agency, since the
    -- following message is still emitted by the inbound peer.
    -- But in the future, we expect that `MsgInit` will carry a payload,
    -- typically a ticketNo, that allows the outbound side to "resume" from the
    -- last known point of the inbound side, instead of advertising any possible
    -- object starting with the first one in the ObjectPool.
    --
    -- See https://github.com/tweag/cardano-peras/issues/182
    MsgInit
      :: Message (ObjectDiffusion objectId object) StInit StIdle
    -- | Request a list of object identifiers from the server, and confirm a
    -- number of outstanding object identifiers.
    --
    -- With 'TokBlocking' this is a blocking operation: the response will always
    -- have at least one object identifier, and it does not expect a prompt
    -- response: there is no timeout. This covers the case when there is nothing
    -- else to do but wait.
    --
    -- With 'TokNonBlocking' this is a non-blocking operation: the response may
    -- be an empty list and this does expect a prompt response. This covers high
    -- throughput use cases where we wish to pipeline, by interleaving requests
    -- for additional object identifiers with requests for objects, which
    -- requires these requests not block.
    --
    -- The request gives the maximum number of object identifiers that can be
    -- accepted in the response. This must be greater than zero in the
    -- 'TokBlocking' case. In the 'TokNonBlocking' case either the numbers
    -- acknowledged or the number requested __MUST__ be non-zero. In either
    -- case, the number requested __MUST__ not put the total outstanding over
    -- the fixed protocol limit.
    --
    -- The request also gives the number of outstanding object identifiers that
    -- can now be acknowledged. The actual objects to acknowledge are known to
    -- the server based on the FIFO order in which they were provided.
    --
    -- There is no choice about when to use the blocking case versus the
    -- non-blocking case, it depends on whether there are any remaining
    -- unacknowledged objects (after taking into account the ones acknowledged
    -- in this message):
    --
    -- * The blocking case __MUST__ be used when there are zero remaining
    --   unacknowledged objects.
    --
    -- * The non-blocking case __MUST__ be used when there are non-zero
    --   remaining unacknowledged objects.

    MsgRequestObjectIds
      :: forall (blocking :: StBlockingStyle) objectId object.
         SingBlockingStyle blocking
      -> NumObjectIdsAck -- ^ Acknowledge this number of outstanding objects
      -> NumObjectIdsReq -- ^ Request up to this number of object ids
      -> Message (ObjectDiffusion objectId object) StIdle (StObjectIds blocking)
    -- | Reply with a list of object identifiers for available objects, along
    -- with the size of each object.
    --
    -- The list must not be longer than the maximum number requested.
    --
    -- In the 'StObjectIds' 'Blocking' state the list must be non-empty while in
    -- the 'StObjectIds' 'NonBlocking' state the list may be empty.
    --
    -- These objects are added to the notional FIFO of outstanding object
    -- identifiers for the protocol.
    --
    -- The order in which these object identifiers are returned must be the
    -- order in which they are submitted to the mempool, to preserve dependent
    -- objects.

    MsgReplyObjectIds
      :: BlockingReplyList blocking objectId
      -> Message (ObjectDiffusion objectId object) (StObjectIds blocking) StIdle
    -- | Request one or more objects corresponding to the given object
    -- identifiers.
    --
    -- While it is the responsibility of the server to keep within
    -- pipelining in-flight limits, the client must also cooperate by keeping
    -- the total requested across all in-flight requests within the limits.
    --
    -- It is an error to ask for object identifiers that were not
    -- previously announced (via 'MsgReplyObjectIds').
    --
    -- It is an error to ask for object identifiers that are not
    -- outstanding or that were already asked for.

    MsgRequestObjects
      :: [objectId]
      -> Message (ObjectDiffusion objectId object) StIdle StObjects
    -- | Reply with the requested objects, or implicitly discard.
    --
    -- Objects can become invalid between the time the object
    -- identifier was sent and the object being requested. Invalid
    -- (including committed) objects do not need to be sent.
    --
    -- Any object identifiers requested but not provided in this reply
    -- should be considered as if this peer had never announced them. (Note
    -- that this is no guarantee that the object is invalid, it may still
    -- be valid and available from another peer).

    MsgReplyObjects
      :: [object]
      -> Message (ObjectDiffusion objectId object) StObjects StIdle

    -- | Termination message, initiated by the client side when idle.
    MsgDone
      :: Message (ObjectDiffusion objectId object) StIdle StDone

  type StateAgency StInit          = ClientAgency
  type StateAgency StIdle          = ClientAgency
  type StateAgency (StObjectIds b) = ServerAgency
  type StateAgency StObjects       = ServerAgency
  type StateAgency StDone          = NobodyAgency

  type StateToken = SingObjectDiffusion

instance ( NFData objectId
         , NFData object
         )
      => NFData (Message (ObjectDiffusion objectId object) from to) where
  rnf :: Message (ObjectDiffusion objectId object) from to -> ()
rnf Message (ObjectDiffusion objectId object) from to
R:MessageObjectDiffusionfromto objectId object from to
MsgInit                          = ()
  rnf (MsgRequestObjectIds SingBlockingStyle blocking
tkbs NumObjectIdsAck
w1 NumObjectIdsReq
w2) = SingBlockingStyle blocking -> ()
forall a. NFData a => a -> ()
rnf SingBlockingStyle blocking
tkbs () -> () -> ()
forall a b. a -> b -> b
`seq` NumObjectIdsAck -> ()
forall a. NFData a => a -> ()
rnf NumObjectIdsAck
w1 () -> () -> ()
forall a b. a -> b -> b
`seq` NumObjectIdsReq -> ()
forall a. NFData a => a -> ()
rnf NumObjectIdsReq
w2
  rnf (MsgReplyObjectIds BlockingReplyList blocking objectId
brl)          = BlockingReplyList blocking objectId -> ()
forall a. NFData a => a -> ()
rnf BlockingReplyList blocking objectId
brl
  rnf (MsgRequestObjects [objectId]
objIds)       = [objectId] -> ()
forall a. NFData a => a -> ()
rnf [objectId]
objIds
  rnf (MsgReplyObjects [object]
objects)        = [object] -> ()
forall a. NFData a => a -> ()
rnf [object]
objects
  rnf Message (ObjectDiffusion objectId object) from to
R:MessageObjectDiffusionfromto objectId object from to
MsgDone                          = ()

deriving instance (Eq objectId, Eq object)
               => Eq (Message (ObjectDiffusion objectId object) from to)

deriving instance (Show objectId, Show object)
               => Show (Message (ObjectDiffusion objectId object) from to)