URI Escaping in Haskell (or, reinventing the wheel in style)
As part of my efforts to learn more about functional programming in general and Haskell in specific, I chose a small project that was tangentially related to the work I do in my web programming work at Enterity. If anyone out there knows of a built-in for converting from Int to Hex and back again, I'd be much obliged. I didn't see anything skimming the standard libraries via Zvon.org
module Main where
import System.Environment
import Char
import List
main :: IO ()
main = do args <- getArgs
case ( args !! 0 ) of
"encode" -> putStrLn ( encode $ concat $ tail args )
"decode" -> putStrLn ( decode $ head $ tail args )
-- --------------------------------------
encode :: String -> String
encode str = concat $ map encodeChar str
decode :: String -> String
decode "" = ""
decode (c:cs) = case c of
'%' -> fromHex( take 2 cs ) : decode( drop 2 cs )
otherwise -> c : decode cs
-- --------------------------------------
encodeChar :: Char -> String
encodeChar c =
case isLegalChar c of
True -> c : ""
otherwise -> '%' : ( toHex . ord ) c
isLegalChar :: Char -> Bool
isLegalChar c = any (c==) ( [ 'A' .. 'Z' ] ++ ['a' .. 'z'] ++ [ '0'..'9' ] ++ "-_.!~*'()" )
-- --------------------------------------
toHex :: Int -> String
toHex 0 = ""
toHex x =
let rem = x `mod` 16
in toHex( ( x-rem ) `div` 16 ) ++ [ toChar rem ]
fromHex :: String -> Char
fromHex hx =
let a = fromChar $ head hx
z = fromChar $ head $ tail hx
in chr( a * 16 + z )
-- --------------------------------------
toChar :: Int -> Char
toChar x = ( [ '0' .. '9' ] ++ [ 'a' .. 'f' ] ) !! x
fromChar :: Char -> Int
fromChar x = case findIndex (x==) ( [ '0' .. '9' ] ++ [ 'a' .. 'f' ] ) of
Nothing -> 0
Just y -> y