packages feed

mulang-3.5.2: src/Text/Inflections/Tokenizer.hs

module Text.Inflections.Tokenizer (
  CaseStyle,
  camelCase,
  snakeCase,
  rubyCase,
  canTokenize,
  tokenize) where

import Data.Char (toLower, isDigit, isLower)
import Data.Either (isRight)

import Text.Inflections
import Text.Inflections.Parse.Types
import Text.Parsec.Error (ParseError)

import Control.Fallible

type CaseStyle = String -> Either Text.Parsec.Error.ParseError [Text.Inflections.Parse.Types.Word]

camelCase      :: CaseStyle
camelCase      = parseCamelCase [] . filter (not.isDigit)

snakeCase      :: CaseStyle
snakeCase      = parseSnakeCase []

rubyCase       :: CaseStyle
rubyCase  word | (isLower.head) word = snakeCase baseWord
               | otherwise           = camelCase baseWord

               where baseWord = filter (`notElem` "!?+-=[]<>|&*/") word

canTokenize :: CaseStyle -> String -> Bool
canTokenize style = isRight . style

tokenize :: CaseStyle -> String -> [String]
tokenize style s | Just words <- (wordsOrNothing . style) s = concatMap toToken words
                 | otherwise = []
                  where toToken = return . map toLower


wordsOrNothing = fmap (concatMap c) . orNothing
                where c (Word w) = [w]
                      c _        = []