@@ -14,6 +14,11 @@ module Streamly.Internal.Unicode.Char.Parser
1414 (
1515 -- * Generic
1616 char
17+ , charAnyCase
18+
19+ -- * Sequences
20+ , string
21+ , stringAnyCase
1722 , dropSpace
1823 , dropSpace1
1924
@@ -140,10 +145,25 @@ CHAR_PARSER(asciiLower,isAsciiLower)
140145char :: MonadCatch m => Char -> Parser m Char Char
141146char c = Parser.satisfy (== c)
142147
148+-- XXX Case conversion may lead to change in number of chars
149+-- | Match a specific character ignoring case.
150+{-# INLINE charAnyCase #-}
151+charAnyCase :: MonadCatch m => Char -> Parser m Char Char
152+charAnyCase c = Parser.lmap Char.toLower (Parser.satisfy (== Char.toLower c))
153+
143154--------------------------------------------------------------------------------
144155-- Character sequences
145156--------------------------------------------------------------------------------
146157
158+-- | Match the input with the supplied string and return it if successful.
159+string :: MonadCatch m => String -> Parser m Char String
160+string = Parser.list
161+
162+-- XXX Not accurate unicode case conversion
163+-- | Match the input with the supplied string and return it if successful.
164+stringAnyCase :: MonadCatch m => String -> Parser m Char String
165+stringAnyCase s = Parser.lmap Char.toLower (Parser.list (map Char.toLower s))
166+
147167-- | Drop /zero/ or more white space characters.
148168dropSpace :: MonadCatch m => Parser m Char ()
149169dropSpace = Parser.dropWhile Char.isSpace