module Text.Inflections.Parse.SnakeCase
( parseSnakeCase )
where
import Control.Applicative
import Data.Text (Text)
import Text.Inflections.Types
import Text.Megaparsec
import Text.Megaparsec.Text
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
parseSnakeCase :: (Foldable f, Functor f)
=> f (Word 'Acronym)
-> Text
-> Either (ParseError Char Dec) [SomeWord]
parseSnakeCase acronyms = parse (parser acronyms) ""
parser :: (Foldable f, Functor f)
=> f (Word 'Acronym)
-> Parser [SomeWord]
parser acronyms = (pWord acronyms `sepBy` char '_') <* eof
pWord :: (Foldable f, Functor f)
=> f (Word 'Acronym)
-> Parser SomeWord
pWord acronyms = do
let acs = unWord <$> acronyms
r <- T.pack <$> some alphaNumChar
if r `elem` acs
then maybe empty (return . SomeWord) (mkAcronym r)
else maybe empty (return . SomeWord) (mkWord r)