packages feed

htalkat-0.1.1: HexString.hs

-- This file is part of htalkat
-- Copyright (C) 2021 Martin Bays <mbays@sdf.org>
--
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of version 3 of the GNU General Public License as
-- published by the Free Software Foundation, or any later version.
--
-- You should have received a copy of the GNU General Public License
-- along with this program.  If not, see http://www.gnu.org/licenses/.

{-# LANGUAGE Safe #-}

module HexString where

import           Data.ByteString (ByteString, pack, unpack)

parseHexString :: String -> Maybe ByteString
parseHexString s = pack <$> parseHexString' s
    where
    parseHexString' (a:b:c) = do
        ha <- fromHex a
        hb <- fromHex b
        (16 * ha + hb :) <$> parseHexString' c
        where
        fromHex '0' = Just 0
        fromHex '1' = Just 1
        fromHex '2' = Just 2
        fromHex '3' = Just 3
        fromHex '4' = Just 4
        fromHex '5' = Just 5
        fromHex '6' = Just 6
        fromHex '7' = Just 7
        fromHex '8' = Just 8
        fromHex '9' = Just 9
        fromHex 'a' = Just 10
        fromHex 'b' = Just 11
        fromHex 'c' = Just 12
        fromHex 'd' = Just 13
        fromHex 'e' = Just 14
        fromHex 'f' = Just 15
        fromHex 'A' = Just 10
        fromHex 'B' = Just 11
        fromHex 'C' = Just 12
        fromHex 'D' = Just 13
        fromHex 'E' = Just 14
        fromHex 'F' = Just 15
        fromHex _   = Nothing
    parseHexString' [] = Just []
    parseHexString' _ = Nothing

showHexString :: ByteString -> String
showHexString = concat . (showHexWord8 <$>) . unpack
    where showHexWord8 w =
            let (a,b) = quotRem w 16
                hex = ("0123456789abcdef" !!) . fromIntegral
            in hex a : hex b : ""