urbit-hob-0.2.0: lib/Data/Serialize/Extended.hs
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 = BS.pack . unfoldr step 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