module Network.HTTP.Lucu.Utils
( splitBy
, joinWith
, trim
, isWhiteSpace
, quoteStr
, parseWWWFormURLEncoded
)
where
import Control.Monad
import Data.List hiding (last)
import Network.URI
import Prelude hiding (last)
splitBy :: (a -> Bool) -> [a] -> [[a]]
splitBy isSep src
= case break isSep src
of (last , [] ) -> [last]
(first, _sep:rest) -> first : splitBy isSep rest
joinWith :: [a] -> [[a]] -> [a]
joinWith = (join .) . intersperse
trim :: (a -> Bool) -> [a] -> [a]
trim !p = trimTail . trimHead
where
trimHead = dropWhile p
trimTail = reverse . trimHead . reverse
isWhiteSpace :: Char -> Bool
isWhiteSpace ' ' = True
isWhiteSpace '\t' = True
isWhiteSpace '\r' = True
isWhiteSpace '\n' = True
isWhiteSpace _ = False
quoteStr :: String -> String
quoteStr !str = concat (["\""] ++ map quote str ++ ["\""])
where
quote :: Char -> String
quote '"' = "\\\""
quote c = [c]
parseWWWFormURLEncoded :: String -> [(String, String)]
parseWWWFormURLEncoded src
| src == "" = []
| otherwise = do pairStr <- splitBy (\ c -> c == ';' || c == '&') src
let (key, value) = break (== '=') pairStr
return ( unEscapeString key
, unEscapeString $ case value of
('=':val) -> val
val -> val
)