----------------------------------------------------------------------------- -- | -- Module : Text.Regex.Impl -- Copyright : (c) Chris Kuklewicz 2006 -- License : BSD-style (see the file LICENSE) -- -- Maintainer : libraries@haskell.org, textregexlazy@personal.mightyreason.com -- Stability : experimental -- Portability : non-portable (Text.Regex.Base needs MPTC+FD) -- -- Helper functions for defining certain instances of -- RegexContext. These help when defining instances of RegexContext -- with repeated types: -- -- @ -- instance (RegexLike regex source) => RegexContext regex source source where -- @ -- -- runs into overlapping restrictions. To avoid this I have each backend -- define, for its own Regex type: -- -- @ -- instance RegexContext Regex String String where -- match = polymatch -- matchM = polymatchM -- @ -- -- @ -- instance RegexContext Regex ByteString ByteString where -- match = polymatch -- matchM = polymatchM -- @ ------------------------------------------------------------------------------- module Text.Regex.Base.Impl(polymatch,polymatchM) where import Text.Regex.Base import Data.Array((!)) regexFailed :: (Monad m) => m b {-# INLINE regexFailed #-} regexFailed = fail $ "regex failed to match" actOn :: (RegexLike r s,Monad m) => ((s,MatchText s,s)->t) -> r -> s -> m t {-# INLINE actOn #-} actOn f r s = case matchOnceText r s of Nothing -> regexFailed Just preMApost -> return (f preMApost) polymatch :: (RegexLike a b) => a -> b -> b {-# INLINE polymatch #-} polymatch r s = case matchOnceText r s of Nothing -> empty Just (_,ma,_) -> fst (ma!0) polymatchM :: (RegexLike a b,Monad m) => a -> b -> m b {-# INLINE polymatchM #-} polymatchM = actOn (\(_,ma,_)->fst (ma!0))