    -----------------------------------------------------------------------------
    -- |
    -- Module      :  Coded.Text.Raw
    -- Copyright   :  (c) Dominic Steinitz 2006
    -- License     :  BSD-style (see the file ReadMe.tex)
    --
    -- Maintainer  :  dominic.steinitz@blueyonder.co.uk
    -- Stability   :  experimental
    -- Portability :  portable
    --
    -----------------------------------------------------------------------------

    module Codec.Text.Raw(
       hexdump,
       hexdumpBy,
       ) where

    import Data.List
    import Codec.Utils
    import Numeric
    import Text.PrettyPrint

    split :: Int -> [a] -> [[a]]
    split n xs = unfoldr (g n) xs

    g :: Int -> [a] -> Maybe ([a],[a])
    g n [] = Nothing
    g n y  = Just (splitAt n y)

    sh x | x < 16    = '0':(showHex x "")
         | otherwise = showHex x ""

    type OctetsPerLine = Int

    hexdump :: OctetsPerLine -> [Octet] -> Doc
    hexdump n =
       vcat .
       map hcat .
       map (intersperse colon) .
       map (map (text . sh)) .
       split n

    hexdumpBy :: String -> OctetsPerLine -> [Octet] -> Doc
    hexdumpBy s n =
       vcat .
       map hcat .
       map (intersperse (text s)) .
       map (map (text . sh)) .
       split n