{-# LANGUAGE OverloadedStrings #-}
module Data.ByteString.Base16.Lazy
(
encode
, decode
) where
import Data.Word (Word8)
import qualified Data.ByteString.Base16 as B16
import qualified Data.ByteString as B
import qualified Data.ByteString.Unsafe as B
import Data.ByteString.Lazy.Internal
encode :: ByteString -> ByteString
encode (Chunk c cs) = Chunk (B16.encode c) (encode cs)
encode Empty = Empty
decode :: ByteString -> (ByteString, ByteString)
decode = foldrChunks go (Empty, Empty)
where go c ~(y,z)
| len == 0 = (chunk h y, z)
| len == 1 && isHex (B.unsafeHead t) =
case z of
Chunk a as | isHex (B.unsafeHead a)
-> let (q,_) = B16.decode (t `B.snoc` B.unsafeHead a)
in (chunk h (chunk q y), chunk (B.unsafeTail a) as)
_ -> (chunk h y, chunk t z)
| otherwise = (chunk h y, chunk t z)
where (h,t) = B16.decode c
len = B.length t
isHex :: Word8 -> Bool
isHex w = (w >= 48 && w <= 57) || (w >= 97 && w <= 102) || (w >= 65 && w <= 70)