module Text.CaseConversion (
toCase
,fromCase
,WordCase (..)
,toCamelCase
,toSnakeCase
,toSpinalCase
,fromCamelCase
,fromSnakeCase
,fromSpinalCase
,convertCase
) where
import Data.Char
import Data.List
data WordCase = Camel | Snake | Spinal
toCase Camel = toCamelCase
toCase Snake = toSnakeCase
toCase Spinal = toSpinalCase
fromCase Camel = fromCamelCase
fromCase Snake = fromSnakeCase
fromCase Spinal = fromSpinalCase
toCamelCase (c:cs) = concat (c:map (\(c:cs)->toUpper c: map toLower cs) cs)
toSnakeCase = toCharacterCase '_'
toSpinalCase = toCharacterCase '-'
fromCamelCase = splitBy isUpper
fromSnakeCase = fromCharacterCase '_'
fromSpinalCase = fromCharacterCase '-'
toCharacterCase c cs = concat (intersperse [c] (map (map toLower) cs))
fromCharacterCase c cs = head' ++ map tail tail'
where
(head',tail') = splitAt 1 cs'
cs' = splitBy (==c) cs
splitBy p = groupBy (const (not . p))
convertCase c1 c2 = toCase c2 . fromCase c1