module Sqel.Text.Case where

import Data.Char (isLower, isUpper, toLower)
import Data.Composition ((.:))

unCamelCaseString :: Char -> String -> String
unCamelCaseString :: Char -> [Char] -> [Char]
unCamelCaseString Char
sep =
  forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Char -> Char
toLower forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> [a]
reverse forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl [Char] -> Char -> [Char]
f []
  where
    f :: [Char] -> Char -> [Char]
f [] Char
c =
      [Char
c]
    f (Char
h1 : Char
h2 : [Char]
t) Char
c | Char -> Bool
isLower Char
c Bool -> Bool -> Bool
&& Char -> Bool
isUpper Char
h1 Bool -> Bool -> Bool
&& Char -> Bool
isUpper Char
h2 =
      Char
c forall a. a -> [a] -> [a]
: Char
h1 forall a. a -> [a] -> [a]
: Char
sep forall a. a -> [a] -> [a]
: Char
h2 forall a. a -> [a] -> [a]
: [Char]
t
    f (Char
h : [Char]
t) Char
c | Char -> Bool
isUpper Char
c Bool -> Bool -> Bool
&& Char -> Bool
isLower Char
h =
      Char
c forall a. a -> [a] -> [a]
: Char
sep forall a. a -> [a] -> [a]
: Char
h forall a. a -> [a] -> [a]
: [Char]
t
    f [Char]
z Char
c =
      Char
c forall a. a -> [a] -> [a]
: [Char]
z

unCamelCase :: Char -> String -> Text
unCamelCase :: Char -> [Char] -> Text
unCamelCase =
  forall a. ToText a => a -> Text
toText forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
.: Char -> [Char] -> [Char]
unCamelCaseString

unCamelCaseText :: Char -> Text -> Text
unCamelCaseText :: Char -> Text -> Text
unCamelCaseText Char
sep =
  Char -> [Char] -> Text
unCamelCase Char
sep forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ToString a => a -> [Char]
toString