module Hidden.RegexPRTypes ( reverseRegexAction , RegexSrcParser , RegexAction(..) , RegexResult , MatchList , RegexParser , runRegexParser ) where import Hidden.ParseLib( Parse, runParse ) import Control.Monad.State( StateT, runStateT ) import Control.Monad.Reader( ReaderT(runReaderT) ) import Hidden.Tools( modifySnd ) type RegexResult = ( String, (String, String) ) type MatchList = [ (Int, String) ] type RegexParser = ReaderT (String, String) (StateT MatchList (Parse Char)) runRegexParser :: (String, String) -> RegexParser a -> (String, String) -> [((a, MatchList), (String, String))] runRegexParser point = runParse . flip runStateT [] . flip runReaderT point type RegexSrcParser = StateT Int (Parse Char) data RegexAction = Select (Char -> Bool) | Repeat Int (Maybe Int) RegexAction | RepeatNotGreedy Int (Maybe Int) RegexAction | RegexOr [RegexAction] [RegexAction] | Note Int [RegexAction] | BackReference Int | Still [RegexAction] | Backword [RegexAction] | RegActNot [RegexAction] | BeginningOfInput | EndOfInput | PreMatchPoint | Parens [RegexAction] | Comment String reverseRegexAction :: RegexAction -> RegexAction reverseRegexAction (Note i ras) = Note i $ reverse $ map reverseRegexAction ras reverseRegexAction (RegexOr ras1 ras2) = RegexOr (reverse $ map reverseRegexAction ras1) (reverse $ map reverseRegexAction ras2) -- reverseRegexAction (Still ras) -- = Still $ reverse $ map reverseRegexAction ras -- reverseRegexAction (Backword ras) -- = Backword $ reverse $ map reverseRegexAction ras reverseRegexAction ra = ra