module Utils.Drasil.English (capitalize, foldlList, stringList) where
import Data.Char (toLower, toUpper)
import Data.List.Extras (foldle1)
import Data.String (IsString (fromString))
capitalize :: String -> String
capitalize :: String -> String
capitalize [] = String -> String
forall a. HasCallStack => String -> a
error String
"capitalize called on an empty String"
capitalize (Char
c:String
cs) = Char -> Char
toUpper Char
cChar -> String -> String
forall a. a -> [a] -> [a]
:(Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Char -> Char
toLower String
cs
foldlList :: (IsString a, Semigroup a) => [a] -> a
foldlList :: forall a. (IsString a, Semigroup a) => [a] -> a
foldlList [] = String -> a
forall a. IsString a => String -> a
fromString String
""
foldlList [a
a,a
b] = a
a a -> a -> a
forall a. Semigroup a => a -> a -> a
<> String -> a
forall a. IsString a => String -> a
fromString String
" and " a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
b
foldlList [a]
lst = (a -> a -> a) -> (a -> a -> a) -> [a] -> a
forall a. (a -> a -> a) -> (a -> a -> a) -> [a] -> a
foldle1 (\a
a a
b -> a
a a -> a -> a
forall a. Semigroup a => a -> a -> a
<> String -> a
forall a. IsString a => String -> a
fromString String
", " a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
b) (\a
a a
b -> a
a a -> a -> a
forall a. Semigroup a => a -> a -> a
<> String -> a
forall a. IsString a => String -> a
fromString String
", and " a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
b) [a]
lst
stringList :: [String] -> String
stringList :: [String] -> String
stringList = [String] -> String
forall a. (IsString a, Semigroup a) => [a] -> a
foldlList ([String] -> String)
-> ([String] -> [String]) -> [String] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool) -> (String -> Bool) -> String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null)