`get @[T]` is incorrect if `putList @T` is not `defaultPutList`
Context:
class Binary t where
-- | Encode a value in the Put monad.
put :: t -> Put
-- | Decode a value in the Get monad
get :: Get t
-- | Encode a list of values in the Put monad.
-- The default implementation may be overridden to be more efficient
-- but must still have the same encoding format.
putList :: [t] -> Put
putList = defaultPutList
default put :: (Generic t, GBinaryPut (Rep t)) => t -> Put
put = gput . from
default get :: (Generic t, GBinaryGet (Rep t)) => Get t
get = to `fmap` gget
{-# INLINE defaultPutList #-}
defaultPutList :: Binary a => [a] -> Put
defaultPutList xs = put (length xs) <> mapM_ put xs
...
instance Binary a => Binary [a] where
put = putList
get = do n <- get :: Get Int
getMany n
-- | @'getMany' n@ get @n@ elements in order, without blowing the stack.
getMany :: Binary a => Int -> Get [a]
getMany n = go [] n
where
go xs 0 = return $! reverse xs
go xs i = do x <- get
-- we must seq x to avoid stack overflows due to laziness in
-- (>>=)
x `seq` go (x:xs) (i-1)
{-# INLINE getMany #-}
Note that if wrote a Binary T
instance where putList @T
does something smart like run-length encoding, then I'd get crashes when deserialising a [T]
by calling get @[T]
.