module Text.Inflections.Parse.CamelCase
( parseCamelCase )
where
import Control.Applicative
import Data.Text (Text)
import Data.Void (Void)
import Text.Inflections.Types
import Text.Megaparsec
import Text.Megaparsec.Char
import qualified Data.Text as T
#if MIN_VERSION_base(4,8,0)
import Prelude hiding (Word)
#else
import Data.Foldable
import Prelude hiding (elem)
#endif
type Parser = Parsec Void Text
parseCamelCase :: (Foldable f, Functor f)
=> f (Word 'Acronym)
-> Text
-> Either (ParseError Char Void) [SomeWord]
parseCamelCase acronyms = parse (parser acronyms) ""
parser :: (Foldable f, Functor f)
=> f (Word 'Acronym)
-> Parser [SomeWord]
parser acronyms = many (a <|> n) <* eof
where
n = SomeWord <$> word
a = SomeWord <$> acronym acronyms
acronym :: (Foldable f, Functor f)
=> f (Word 'Acronym)
-> Parser (Word 'Acronym)
acronym acronyms = do
x <- choice (string . unWord <$> acronyms)
case mkAcronym x of
Nothing -> empty
Just acr -> return acr
word :: Parser (Word 'Normal)
word = do
firstChar <- upperChar <|> lowerChar
restChars <- many $ lowerChar <|> digitChar
case (mkWord . T.pack) (firstChar : restChars) of
Nothing -> empty
Just wrd -> return wrd