{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE CPP #-}
#if __GLASGOW_HASKELL__ >= 800
{-# OPTIONS_GHC -fno-warn-redundant-constraints #-}
{-# LANGUAGE TemplateHaskellQuotes #-}
#else
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
#endif
module Text.RE.ZeInternals.SearchReplace.TDFAEdPrime
( ed'
) where
import Language.Haskell.TH
import Language.Haskell.TH.Quote
import Prelude.Compat
import Text.RE.REOptions
import Text.RE.Replace
import Text.RE.Tools.IsRegex
import Text.RE.ZeInternals
import Text.RE.ZeInternals.TDFA
import Text.RE.ZeInternals.Types.Poss
ed' :: Q Exp -> Maybe SimpleREOptions -> QuasiQuoter
ed' qe mb = case mb of
Nothing ->
(qq0 "ed'")
{ quoteExp = parse minBound $ \rs -> AppE <$> qe <*> [|flip unsafe_compile_sr rs|]
}
Just sro ->
(qq0 "ed'")
{ quoteExp = parse sro $ \rs -> AppE <$> qe <*> [|unsafe_compile_sr_simple sro rs|]
}
where
parse :: SimpleREOptions -> (String->Q Exp) -> String -> Q Exp
parse sro mk ts = either error (\_->mk ts) ei
where
ei :: Either String (SearchReplace RE String)
ei = poss2either $ compileSearchReplace_ id (poss2either . compileRegexWith sro) ts
unsafe_compile_sr_simple :: IsRegex RE s
=> SimpleREOptions
-> String
-> SearchReplace RE s
unsafe_compile_sr_simple sro =
unsafe_compile_sr $ unpackSimpleREOptions sro
unsafe_compile_sr :: (IsOption o, IsRegex RE s)
=> o
-> String
-> SearchReplace RE s
unsafe_compile_sr os =
unsafeCompileSearchReplace_ packR $ poss2either . compileRegexWithOptionsForQQ os