packages feed

dfinity-radix-tree-0.6.0: src/DFINITY/RadixTree/Serialise.hs

{-# LANGUAGE LambdaCase #-}

{-# OPTIONS -Wall #-}

module DFINITY.RadixTree.Serialise
  ( decodeLeaf
  , decodeMaybe
  , decodeSide
  , decodeShort
  , encodeMaybe
  , encodeSide
  , encodeShort
  )
where

import Codec.Serialise.Decoding
import Codec.Serialise.Encoding
import Control.Monad
import Data.ByteString
import Data.ByteString.Short

decodeLeaf :: Int -> Decoder s (Maybe ByteString)
decodeLeaf = \case
  3 -> pure Nothing
  4 -> pure <$> decodeBytes
  _ -> fail "decodeLeaf: invalid argument"

decodeMaybe :: Decoder s a -> Decoder s (Maybe a)
decodeMaybe value = peekTokenType >>= \case
  TypeNull -> decodeNull >> pure Nothing
  _        -> pure <$> value

decodeSide :: Decoder s ByteString
decodeSide = void decodeTag >> decodeBytes

decodeShort :: Decoder s ShortByteString
decodeShort = toShort <$> decodeBytes

encodeMaybe :: (a -> Encoding) -> Maybe a -> Encoding
encodeMaybe = maybe encodeNull

encodeSide :: ByteString -> Encoding
encodeSide side = encodeTag 42 <> encodeBytes side

encodeShort :: ShortByteString -> Encoding
encodeShort = encodeBytes . fromShort