module Encoding.LetterToNumber ( encltn , decltn ) where import Data.Char (ord, chr, isAscii, isAlpha, isSpace, isDigit, toUpper) import Data.ByteString (ByteString) import qualified Data.ByteString.Char8 as BC -- This encodes ASCII characters only and ignores all other characters charToNumber :: Char -> ByteString charToNumber c | not (isAscii c) = BC.pack "" | isAlpha c = BC.pack $ show $ ord (toUpper c) - ord 'A' + 1 | isSpace c = BC.pack "0" | otherwise = BC.singleton c numberToChar :: ByteString -> ByteString numberToChar s | s == BC.pack "0" = BC.singleton ' ' | BC.all isDigit s = BC.singleton $ chr $ (read $ BC.unpack s) + ord 'A' - 1 | otherwise = s encltn :: ByteString -> ByteString encltn input = BC.unwords $ filter (not . BC.null) $ map charToNumber $ BC.unpack input decltn :: ByteString -> ByteString decltn input = BC.concat $ map numberToChar $ BC.words input