module Unused.Projection.Transform ( Transform(..) , runTransformations ) where import Data.Either (rights) import Data.Text (Text) import qualified Data.Text as T import qualified Text.Inflections as I import qualified Text.Inflections.Parse.Types as I import qualified Unused.Util as U data Transform = Camelcase | Snakecase | Noop runTransformations :: Text -> [Transform] -> Text runTransformations = foldl (flip runTransformation) runTransformation :: Transform -> Text -> Text runTransformation Camelcase = toCamelcase runTransformation Snakecase = toSnakecase runTransformation Noop = id toCamelcase :: Text -> Text toCamelcase t = maybe t (T.pack . I.camelize) $ toMaybeWords t toSnakecase :: Text -> Text toSnakecase t = maybe t (T.pack . I.underscore) $ toMaybeWords t toMaybeWords :: Text -> Maybe [I.Word] toMaybeWords t = U.safeHead $ rights [asCamel, asSnake] where asCamel = I.parseCamelCase [] $ T.unpack t asSnake = I.parseSnakeCase [] $ T.unpack t