module Data.Serialize.Extended ( roll , unroll ) where import Data.Bits import qualified Data.ByteString as BS import Data.List (unfoldr) import Numeric.Natural (Natural) -- | Simple little-endian ByteString encoding for Naturals. unroll :: Natural -> BS.ByteString unroll nat = case nat of 0 -> BS.singleton 0 _ -> BS.pack (unfoldr step nat) where step 0 = Nothing step i = Just (fromIntegral i, i `shiftR` 8) -- | Simple little-endian ByteString decoding for Naturals. roll :: BS.ByteString -> Natural roll = foldr unstep 0 . BS.unpack where unstep b a = a `shiftL` 8 .|. fromIntegral b