    -- | This module provides efficient receiving functions from the network.
    --   'Network.Socket.ByteString.recv' uses 'createAndTrim'
    --   which behaves as follows:
    --
    --   * Allocates a buffer whose size is decided from the
    --     first argument.
    --   * Receives data with the buffer.
    --   * Allocates another buffer whose size fits the received data.
    --   * Copies the data from the first buffer to the second buffer.
    --
    --  On 64bit machines, the global lock is taken for the allocation of
    --  a byte string whose length is larger than or equal to 3272 bytes.
    --  So, for instance, if 4,096 is specified to 'recv' and the size of
    --  received data is 3,300, the global lock is taken twice with the copy
    --  overhead.
    --
    --  The efficient receiving functions provided here use a buffer pool.
    --  A large buffer is allocated at the beginning and it is divided into
    --  a used one and a leftover when receiving.
    --  The latter is kept in the buffer pool and will be used next time.
    --  When the buffer gets small
    --  and usefless, a new large buffer is allocated.
    module Network.Socket.BufferPool (
        -- * Recv
        Recv,
        receive,
        BufferPool,
        newBufferPool,
        withBufferPool,

        -- * RecvN
        RecvN,
        makeRecvN,

        -- * Types
        Buffer,
        BufSize,

        -- * Utilities
        mallocBS,
        copy,
    ) where

    import Network.Socket.BufferPool.Buffer
    import Network.Socket.BufferPool.Recv
    import Network.Socket.BufferPool.Types