{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Cardano.Ledger.Binary.Encoding (
serialize,
serialize',
serializeBuilder,
hashWithEncoder,
hashEncCBOR,
module Cardano.Ledger.Binary.Version,
module Cardano.Ledger.Binary.Encoding.Encoder,
module Cardano.Ledger.Binary.Encoding.EncCBOR,
encodeNestedCbor,
encodeNestedCborBytes,
runByteBuilder,
encodeMemPack,
) where
import qualified Cardano.Crypto.Hash.Class as C
import Cardano.Ledger.Binary.Encoding.EncCBOR
import Cardano.Ledger.Binary.Encoding.Encoder
import Cardano.Ledger.Binary.Version
import Codec.CBOR.ByteArray.Sliced (fromByteArray)
import qualified Data.ByteString as BS
import Data.ByteString.Builder (Builder)
import Data.ByteString.Builder.Extra (safeStrategy, toLazyByteStringWith)
import qualified Data.ByteString.Lazy as BSL
import qualified Data.MemPack as MP
serialize :: EncCBOR a => Version -> a -> BSL.ByteString
serialize :: forall a. EncCBOR a => Version -> a -> LazyByteString
serialize Version
version =
AllocationStrategy -> LazyByteString -> Builder -> LazyByteString
toLazyByteStringWith AllocationStrategy
strategy LazyByteString
forall a. Monoid a => a
mempty (Builder -> LazyByteString)
-> (a -> Builder) -> a -> LazyByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Version -> Encoding -> Builder
toBuilder Version
version (Encoding -> Builder) -> (a -> Encoding) -> a -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR
where
strategy :: AllocationStrategy
strategy = Int -> Int -> AllocationStrategy
safeStrategy Int
1024 Int
4096
serialize' :: EncCBOR a => Version -> a -> BS.ByteString
serialize' :: forall a. EncCBOR a => Version -> a -> ByteString
serialize' Version
version = LazyByteString -> ByteString
BSL.toStrict (LazyByteString -> ByteString)
-> (a -> LazyByteString) -> a -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Version -> a -> LazyByteString
forall a. EncCBOR a => Version -> a -> LazyByteString
serialize Version
version
serializeBuilder :: EncCBOR a => Version -> a -> Builder
serializeBuilder :: forall a. EncCBOR a => Version -> a -> Builder
serializeBuilder Version
version = Version -> Encoding -> Builder
toBuilder Version
version (Encoding -> Builder) -> (a -> Encoding) -> a -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR
hashWithEncoder :: forall h a. C.HashAlgorithm h => Version -> (a -> Encoding) -> a -> C.Hash h a
hashWithEncoder :: forall h a.
HashAlgorithm h =>
Version -> (a -> Encoding) -> a -> Hash h a
hashWithEncoder Version
version a -> Encoding
toEnc = (a -> ByteString) -> a -> Hash h a
forall h a. HashAlgorithm h => (a -> ByteString) -> a -> Hash h a
C.hashWith (Version -> Encoding -> ByteString
forall a. EncCBOR a => Version -> a -> ByteString
serialize' Version
version (Encoding -> ByteString) -> (a -> Encoding) -> a -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Encoding
toEnc)
hashEncCBOR :: forall h a. (C.HashAlgorithm h, EncCBOR a) => Version -> a -> C.Hash h a
hashEncCBOR :: forall h a.
(HashAlgorithm h, EncCBOR a) =>
Version -> a -> Hash h a
hashEncCBOR Version
version = Version -> (a -> Encoding) -> a -> Hash h a
forall h a.
HashAlgorithm h =>
Version -> (a -> Encoding) -> a -> Hash h a
hashWithEncoder Version
version a -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR
encodeNestedCbor :: EncCBOR a => a -> Encoding
encodeNestedCbor :: forall a. EncCBOR a => a -> Encoding
encodeNestedCbor a
value =
Word -> Encoding
encodeTag Word
24
Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> (Version -> Encoding) -> Encoding
withCurrentEncodingVersion (\Version
version -> LazyByteString -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR (Version -> a -> LazyByteString
forall a. EncCBOR a => Version -> a -> LazyByteString
serialize Version
version a
value))
encodeNestedCborBytes :: BSL.ByteString -> Encoding
encodeNestedCborBytes :: LazyByteString -> Encoding
encodeNestedCborBytes LazyByteString
x = Word -> Encoding
encodeTag Word
24 Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> LazyByteString -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR LazyByteString
x
runByteBuilder :: Int -> Builder -> BS.ByteString
runByteBuilder :: Int -> Builder -> ByteString
runByteBuilder !Int
sizeHint =
LazyByteString -> ByteString
BSL.toStrict (LazyByteString -> ByteString)
-> (Builder -> LazyByteString) -> Builder -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AllocationStrategy -> LazyByteString -> Builder -> LazyByteString
toLazyByteStringWith (Int -> Int -> AllocationStrategy
safeStrategy Int
sizeHint (Int
2 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
sizeHint)) LazyByteString
forall a. Monoid a => a
mempty
{-# NOINLINE runByteBuilder #-}
encodeMemPack :: MP.MemPack a => a -> Encoding
encodeMemPack :: forall a. MemPack a => a -> Encoding
encodeMemPack = SlicedByteArray -> Encoding
encodeByteArray (SlicedByteArray -> Encoding)
-> (a -> SlicedByteArray) -> a -> Encoding
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteArray -> SlicedByteArray
fromByteArray (ByteArray -> SlicedByteArray)
-> (a -> ByteArray) -> a -> SlicedByteArray
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> ByteArray
forall a. (MemPack a, HasCallStack) => a -> ByteArray
MP.pack