{-# LANGUAGE Safe #-}
module Data.String.Utils
(
strip, lstrip, rstrip,
startswith, endswith,
join, split, splitWs, replace, escapeRe,
maybeRead
) where
import Data.Char (isAlpha, isAscii, isDigit)
import Data.List.Utils (endswith, join, replace, split, startswith)
import Data.Maybe (listToMaybe)
import Text.Regex (mkRegex, splitRegex)
wschars :: String
wschars :: [Char]
wschars = [Char]
" \t\r\n"
strip :: String -> String
strip :: [Char] -> [Char]
strip = [Char] -> [Char]
lstrip ([Char] -> [Char]) -> ([Char] -> [Char]) -> [Char] -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> [Char]
rstrip
lstrip :: String -> String
lstrip :: [Char] -> [Char]
lstrip [Char]
s = case [Char]
s of
[] -> []
(Char
x:[Char]
xs) -> if Char -> [Char] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Char
x [Char]
wschars
then [Char] -> [Char]
lstrip [Char]
xs
else [Char]
s
rstrip :: String -> String
rstrip :: [Char] -> [Char]
rstrip = [Char] -> [Char]
forall a. [a] -> [a]
reverse ([Char] -> [Char]) -> ([Char] -> [Char]) -> [Char] -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> [Char]
lstrip ([Char] -> [Char]) -> ([Char] -> [Char]) -> [Char] -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> [Char]
forall a. [a] -> [a]
reverse
splitWs :: String -> [String]
splitWs :: [Char] -> [[Char]]
splitWs = ([Char] -> Bool) -> [[Char]] -> [[Char]]
forall a. (a -> Bool) -> [a] -> [a]
filter (\[Char]
x -> [Char]
x [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
/= []) ([[Char]] -> [[Char]])
-> ([Char] -> [[Char]]) -> [Char] -> [[Char]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Regex -> [Char] -> [[Char]]
splitRegex ([Char] -> Regex
mkRegex [Char]
"[ \t\n\r\v\f]+")
escapeRe :: String -> String
escapeRe :: [Char] -> [Char]
escapeRe [] = []
escapeRe (Char
x:[Char]
xs)
| Char
x Char -> [Char] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Char
'\'', Char
'`'] = Char
x Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
: [Char] -> [Char]
escapeRe [Char]
xs
| Char -> Bool
isDigit Char
x Bool -> Bool -> Bool
|| (Char -> Bool
isAscii Char
x Bool -> Bool -> Bool
&& Char -> Bool
isAlpha Char
x) Bool -> Bool -> Bool
|| Char
x Char -> [Char] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Char
'<', Char
'>']
= Char
x Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
: [Char] -> [Char]
escapeRe [Char]
xs
| Bool
otherwise = Char
'\\' Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
: Char
x Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
: [Char] -> [Char]
escapeRe [Char]
xs
maybeRead :: Read a => String -> Maybe a
maybeRead :: forall a. Read a => [Char] -> Maybe a
maybeRead = ((a, [Char]) -> a) -> Maybe (a, [Char]) -> Maybe a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, [Char]) -> a
forall a b. (a, b) -> a
fst (Maybe (a, [Char]) -> Maybe a)
-> ([Char] -> Maybe (a, [Char])) -> [Char] -> Maybe a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(a, [Char])] -> Maybe (a, [Char])
forall a. [a] -> Maybe a
listToMaybe ([(a, [Char])] -> Maybe (a, [Char]))
-> ([Char] -> [(a, [Char])]) -> [Char] -> Maybe (a, [Char])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> [(a, [Char])]
forall a. Read a => ReadS a
reads