{-# LANGUAGE OverloadedLists #-}
module Data.GS1.Utils (
camelCase
, revertCamelCase
, mkCamelCase
, mkByName
, parseURI
, either2Maybe
, getTotalLength
) where
import Data.Char
import Data.Monoid ((<>))
import qualified Data.Text as T
import Text.Read
putUsOrReturnChar :: Char -> T.Text
putUsOrReturnChar c
| isUpper c = "_" <> [toLower c]
| otherwise = T.singleton c
insertUs :: T.Text -> T.Text
insertUs = T.concatMap putUsOrReturnChar
revertCamelCase :: T.Text -> T.Text
revertCamelCase t
| T.null t = T.empty
| otherwise = let r = insertUs t in
case T.head r of
'_' -> T.tail r
_ -> r
camelCase :: T.Text -> T.Text
camelCase = T.toTitle
mkCamelCaseWord :: [T.Text] -> [T.Text]
mkCamelCaseWord sl = camelCase <$> sl
mkCamelCase :: T.Text -> T.Text
mkCamelCase = T.filter (/=' ') . T.unwords . mkCamelCaseWord . T.splitOn "_"
mkByName :: Read a => T.Text -> Maybe a
mkByName s = readMaybe $ T.unpack $ mkCamelCase s
parseURI :: Read a => T.Text -> T.Text -> Maybe a
parseURI s uri = let(_, s') = T.breakOn uri s in
if s' == s
then mkByName . last $ T.splitOn ":" s
else Nothing
either2Maybe :: Either a b -> Maybe b
either2Maybe (Right x) = Just x
either2Maybe (Left _) = Nothing
getTotalLength :: [T.Text] -> Int
getTotalLength ts = sum $ T.length <$> ts