module WithCli.Normalize ( normalize, matches, ) where import Data.Char matches :: String -> String -> Bool matches :: String -> String -> Bool matches String a String b = String -> String normalize String a forall a. Eq a => a -> a -> Bool == String -> String normalize String b normalize :: String -> String normalize :: String -> String normalize String s = if forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool all (Bool -> Bool not forall b c a. (b -> c) -> (a -> b) -> a -> c . Char -> Bool isAllowedChar) String s then String s else String -> String slugify forall a b. (a -> b) -> a -> b $ forall a. (a -> Bool) -> [a] -> [a] dropWhile (forall a. Eq a => a -> a -> Bool == Char '-') forall a b. (a -> b) -> a -> b $ forall a. (a -> Bool) -> [a] -> [a] filter Char -> Bool isAllowedChar forall a b. (a -> b) -> a -> b $ forall a b. (a -> b) -> [a] -> [b] map (\ Char c -> if Char c forall a. Eq a => a -> a -> Bool == Char '_' then Char '-' else Char c) forall a b. (a -> b) -> a -> b $ String s where slugify :: String -> String slugify (Char a : String r) | Char -> Bool isUpper Char a = String -> String slugify (Char -> Char toLower Char a forall a. a -> [a] -> [a] : String r) slugify (Char a : Char b : String r) | Char -> Bool isUpper Char b = Char a forall a. a -> [a] -> [a] : Char '-' forall a. a -> [a] -> [a] : String -> String slugify (Char -> Char toLower Char b forall a. a -> [a] -> [a] : String r) | Bool otherwise = Char a forall a. a -> [a] -> [a] : String -> String slugify (Char b forall a. a -> [a] -> [a] : String r) slugify String x = String x isAllowedChar :: Char -> Bool isAllowedChar :: Char -> Bool isAllowedChar Char c = (Char -> Bool isAscii Char c Bool -> Bool -> Bool && Char -> Bool isAlphaNum Char c) Bool -> Bool -> Bool || (Char c forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool `elem` String "-_")