, bValToInteger
, bstrToString
, decode
+ , decodeWithLeftOvers
, encode
) where
, Bstr <$> arbitrary]
bval n = oneof [ Bint <$> arbitrary
, Bstr <$> arbitrary
- , Blist <$> vectorOf n (bval (n `div` 4))
- , do keys <- vectorOf n genNonEmptyString
- vals <- vectorOf n (bval (n `div` 4))
+ , Blist <$> vectorOf (n `div` 2) (bval (n `div` 4))
+ , do keys <- vectorOf (n `div` 2) genNonEmptyString
+ vals <- vectorOf (n `div` 2) (bval (n `div` 4))
return $ Bdict $ fromList $ zip keys vals ]
-- getters
decode :: ByteString -> Either ParseError BVal
decode = parse bencVal "BVal"
+decodeWithLeftOvers :: ByteString -> Either ParseError (BVal, ByteString)
+decodeWithLeftOvers = parse ((,) <$> bencVal <*> (fmap pack leftOvers)) "BVal with LeftOvers"
+ where leftOvers = manyTill anyToken eof
+
-- Encode BVal into a bencoded ByteString. Inverse of decode
-- TODO: Use builders and lazy byte string to get O(1) concatenation over O(n)