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
"-_")