tdlib-gen-0.3.0: src/Text/Casing.hs
module Text.Casing where
import Data.Char
import Data.List (intercalate)
import Data.Text (Text, split)
import qualified Data.Text as T
upper :: Text -> Text
upper t = T.cons (toUpper $ T.head t) (T.tail t)
upper' :: String -> String
upper' (x : xs) = toUpper x : xs
lower :: String -> String
lower t = (toLower $ head t) : (tail t)
lower' :: Text -> Text
lower' t = T.cons (toLower $ T.head t) (T.tail t)
splitOn' :: (Char -> Bool) -> String -> [String]
splitOn' p t = go t
where
go1 s "" = (reverse s, "")
go1 "" (x : xs) = go1 [x] xs
go1 s s'@(x : xs) = if not (p x) then go1 (x : s) xs else (reverse s, s')
go x =
let (s, rest) = go1 "" x
in if rest == "" then [s] else s : go rest
snakeToCamel :: Text -> Text
snakeToCamel t =
let (x : xs) = filter (/= "") $ split (== '_') t
in T.concat (lower' x : fmap upper xs)
camelToSnake :: String -> String
camelToSnake t =
let l = splitOn' isUpper t
in intercalate "_" (fmap lower l)