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