code: def snappy_encode(payload, xerial_compatible=False,
                    xerial_blocksize=32 * 1024):
      
      if not has_snappy():  # FIXME This should be static, not checked every call.
          raise NotImplementedError("Snappy codec is not available")
  
      if xerial_compatible:
          def _chunker():
              for i in range(0, len(payload), xerial_blocksize):
                  yield payload[i:i+xerial_blocksize]
  
          out = BytesIO()
          out.write(_XERIAL_HEADER)
  
          for chunk in _chunker():
              block = snappy.compress(chunk)
              out.write(struct.pack('!i', len(block)))
              out.write(block)
  
          out.seek(0)
          return out.read()
  
      else:
          return snappy.compress(payload)
docs: Compress the given data with the Snappy algorithm.
  
      :param bytes payload: Data to compress.
      :param bool xerial_compatible:
          If set then the stream is broken into length-prefixed blocks in
          a fashion compatible with the xerial snappy library.
  
          The format winds up being::
  
              +-------------+------------+--------------+------------+--------------+
              |   Header    | Block1_len | Block1 data  | BlockN len | BlockN data  |
              |-------------+------------+--------------+------------+--------------|
              |  16 bytes   |  BE int32  | snappy bytes |  BE int32  | snappy bytes |
              +-------------+------------+--------------+------------+--------------+
  
      :param int xerial_blocksize:
          Number of bytes per chunk to independently Snappy encode. 32k is the
          default in the xerial library.
  
      :returns: Compressed bytes.
      :rtype: :class:`bytes`