module Text.Inflections.Parse.Parameterizable
( parser
, isValidParamChar
, PChar(..) )
where
import Data.Char (isAsciiLower, isAsciiUpper, isAscii, isDigit)
import Control.Applicative
import qualified Text.Parsec as P
import qualified Text.ParserCombinators.Parsec.Char as C
data PChar = UCase Char
| Acceptable String
| Separator
| Underscore
| OtherAscii Char
| NonAscii Char
deriving (Eq, Show)
acceptableParser :: P.Stream s m Char => P.ParsecT s u m PChar
acceptableParser = do
c <- C.satisfy isValidParamChar
return $ Acceptable [c]
parser :: P.Stream s m Char => P.ParsecT s u m [PChar]
parser = P.many $ P.choice [
acceptableParser
, UCase <$> C.satisfy isAsciiUpper
, Separator <$ C.char '-'
, Underscore <$ C.char '_'
, OtherAscii <$> C.satisfy isAscii
, NonAscii <$> C.satisfy (not . isAscii)
]
isValidParamChar :: Char -> Bool
isValidParamChar c = isAsciiLower c || isDigit c