module Cardano.Api.ChainSync.ClientPipelined
  ( -- * Pipelined protocol type for the client

    -- | The protocol states from the point of view of the client.
    ChainSyncClientPipelined (..)
  , ClientPipelinedStIdle (..)
  , ClientStNext (..)
  , ClientPipelinedStIntersect (..)
  , ChainSyncInstruction (..)

    -- * Implementation Helpers

    -- | It's generally idiomatic to use these functions to implement your
    -- pipelined client. It aids in deciding when to make pipelined requests
    -- vs process received responses.
  , PipelineDecision (..)
  , MkPipelineDecision (..)
  , runPipelineDecision
  , constantPipelineDecision
  , pipelineDecisionMax
  , pipelineDecisionMin
  , pipelineDecisionLowHighMark

    -- * Type level natural numbers
  , N (..)
  , Nat (..)
  , natToInt

    -- * Utilities
  , mapChainSyncClientPipelined
  )
where

import           Ouroboros.Network.Protocol.ChainSync.ClientPipelined
import           Ouroboros.Network.Protocol.ChainSync.PipelineDecision

import           Network.TypedProtocol.Pipelined (N (..), Nat (..), natToInt)