@@ -20,12 +20,11 @@ import Codec.CBOR.Decoding
2020import Codec.CBOR.Encoding
2121import Codec.CBOR.Read
2222import Codec.CBOR.Write
23- import Control.Monad (replicateM , when )
23+ import Control.Monad (when )
2424import Control.Monad.Class.MonadThrow (MonadThrow (.. ))
2525import Data.Bifunctor
2626import qualified Data.ByteString.Char8 as BSC
2727import Data.ByteString.Lazy (ByteString )
28- import Data.Foldable (fold )
2928import qualified Data.Map.Strict as Map
3029import qualified Data.Vector as V
3130import Database.LSMTree.Internal.Config
@@ -223,7 +222,7 @@ instance Decode SnapshotVersion where
223222
224223instance Encode SnapshotMetaData where
225224 encode (SnapshotMetaData label tableType config writeBuffer levels mergingTree) =
226- encodeListLen 7
225+ encodeListLen 6
227226 <> encode label
228227 <> encode tableType
229228 <> encode config
@@ -233,7 +232,7 @@ instance Encode SnapshotMetaData where
233232
234233instance DecodeVersioned SnapshotMetaData where
235234 decodeVersioned ver@ V0 = do
236- _ <- decodeListLenOf 7
235+ _ <- decodeListLenOf 6
237236 SnapshotMetaData
238237 <$> decodeVersioned ver
239238 <*> decodeVersioned ver
@@ -523,14 +522,10 @@ instance DecodeVersioned MergeSchedule where
523522-- SnapLevels
524523
525524instance Encode r => Encode (SnapLevels r ) where
526- encode (SnapLevels levels) =
527- encodeListLen (fromIntegral (V. length levels))
528- <> V. foldMap encode levels
525+ encode (SnapLevels levels) = encode levels
529526
530527instance DecodeVersioned r => DecodeVersioned (SnapLevels r ) where
531- decodeVersioned v@ V0 = do
532- n <- decodeListLen
533- SnapLevels <$> V. replicateM n (decodeVersioned v)
528+ decodeVersioned v@ V0 = SnapLevels <$> decodeVersioned v
534529
535530-- SnapLevel
536531
@@ -549,14 +544,10 @@ instance DecodeVersioned r => DecodeVersioned (SnapLevel r) where
549544-- Vector
550545
551546instance Encode r => Encode (V. Vector r ) where
552- encode rns =
553- encodeListLen (fromIntegral (V. length rns))
554- <> V. foldMap encode rns
547+ encode = encodeVector
555548
556549instance DecodeVersioned r => DecodeVersioned (V. Vector r ) where
557- decodeVersioned v@ V0 = do
558- n <- decodeListLen
559- V. replicateM n (decodeVersioned v)
550+ decodeVersioned = decodeVector
560551
561552-- RunNumber
562553
@@ -745,34 +736,23 @@ instance DecodeVersioned r => DecodeVersioned (SnapMergingTreeState r) where
745736-- SnapPendingMerge
746737
747738instance Encode r => Encode (SnapPendingMerge r ) where
748- encode (SnapPendingLevelMerge pe mt) = fold
749- [ encodeListLen 4
750- , encodeWord 0
751- , encodeMaybe mt
752- , encodeListLen . toEnum $ length pe
753- , foldMap encode pe
754- ]
739+ encode (SnapPendingLevelMerge pe mt) =
740+ encodeListLen 3
741+ <> encodeWord 0
742+ <> encodeList pe
743+ <> encodeMaybe mt
755744 encode (SnapPendingUnionMerge mts) =
756- encodeListLen 2
757- <> encodeWord 1
758- <> encodeListLen (toEnum $ length mts)
759- <> foldMap encode mts
745+ encodeListLen 2
746+ <> encodeWord 1
747+ <> encodeList mts
760748
761749instance DecodeVersioned r => DecodeVersioned (SnapPendingMerge r ) where
762750 decodeVersioned v@ V0 = do
763751 n <- decodeListLen
764752 tag <- decodeWord
765753 case (n, tag) of
766- (4 , 0 ) -> do
767- -- Get the whether or not the levels merge exists
768- peLvls <- decodeMaybe v
769- peLen <- decodeListLen
770- peRuns <- replicateM peLen (decodeVersioned v)
771- pure $ SnapPendingLevelMerge peRuns peLvls
772- (2 , 1 ) -> do
773- -- Get the number of pre-existsing unions to read
774- peLen <- decodeListLen
775- SnapPendingUnionMerge <$> replicateM peLen (decodeVersioned v)
754+ (3 , 0 ) -> SnapPendingLevelMerge <$> decodeList v <*> decodeMaybe v
755+ (2 , 1 ) -> SnapPendingUnionMerge <$> decodeList v
776756 _ -> fail (" [SnapPendingMerge] Unexpected combination of list length and tag: " <> show (n, tag))
777757
778758-- SnapPreExistingRun
@@ -798,14 +778,37 @@ instance DecodeVersioned r => DecodeVersioned (SnapPreExistingRun r) where
798778
799779-- Utilities for encoding/decoding Maybe values
800780
781+ -- Note: the Maybe encoding cannot be nested like (Maybe (Maybe a)), but it is
782+ -- ok for fields of records.
801783encodeMaybe :: Encode a => Maybe a -> Encoding
802784encodeMaybe = \ case
803- Nothing -> encodeBool False <> encodeNull
804- Just en -> encodeBool True <> encode en
805-
785+ Nothing -> encodeNull
786+ Just en -> encode en
806787
807788decodeMaybe :: DecodeVersioned a => SnapshotVersion -> Decoder s (Maybe a )
808- decodeMaybe v@ V0 = decodeBool >>= \ exist ->
809- if exist
810- then Just <$> decodeVersioned v
811- else Nothing <$ decodeNull
789+ decodeMaybe v@ V0 = do
790+ tok <- peekTokenType
791+ case tok of
792+ TypeNull -> Nothing <$ decodeNull
793+ _ -> Just <$> decodeVersioned v
794+
795+ encodeList :: Encode a => [a ] -> Encoding
796+ encodeList xs =
797+ encodeListLen (fromIntegral (length xs))
798+ <> foldr (\ x r -> encode x <> r) mempty xs
799+
800+ decodeList :: DecodeVersioned a => SnapshotVersion -> Decoder s [a ]
801+ decodeList v = do
802+ n <- decodeListLen
803+ decodeSequenceLenN (flip (:) ) [] reverse n (decodeVersioned v)
804+
805+ encodeVector :: Encode a => V. Vector a -> Encoding
806+ encodeVector xs =
807+ encodeListLen (fromIntegral (V. length xs))
808+ <> foldr (\ x r -> encode x <> r) mempty xs
809+
810+ decodeVector :: DecodeVersioned a => SnapshotVersion -> Decoder s (V. Vector a )
811+ decodeVector v = do
812+ n <- decodeListLen
813+ decodeSequenceLenN (flip (:) ) [] (V. reverse . V. fromList)
814+ n (decodeVersioned v)
0 commit comments