1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
{-# 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
-- | construct a quasi quoter from a casting function and @Just sro@
-- if the options are known, otherwise a function take takes the
-- 'SimpleREOptions' and constructs the 'SearchReplace' template
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
|