relit-0.1.3: Text/Regex/Literal.hs
{-# LANGUAGE FlexibleContexts, FlexibleInstances, UndecidableInstances, CPP #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
-- |
-- Literal notation for regular expression.
--
-- Importing this module with the 'QuasiQuotes' and 'OverloadedStrings'
-- extensions making possible to directly specify reqular expression
-- literal. This means that awkward backslashes are not necessary.
--
-- You can copy a regular expression in other languages and paste it
-- to your Haskell program.
--
-- Sample code:
--
-- > {-# LANGUAGE QuasiQuotes, OverloadedStrings #-}
-- >
-- > import Text.Regex.Literal
-- > import Text.Regex.Posix
-- >
-- > -- Regular expression as the regular expression literal
-- > regexp :: Regex
-- > regexp = [$re|\\(foo)\\(bar\.c)|]
--
-- Compare with regular expression as the String literal.
--
-- > regexp :: Regex
-- > regexp = makeRegex ("\\\\(foo)\\\\(bar\\.c)" :: String)
--
-- GHC 6.12.3 or earlier requires the dollar sign before \"re\".
--
-- GHC 7.0.1 does not allow the dollar sign before \"re\".
--
-- GHC 7.0.2 or later allows the dollar sign before \"re\" as an
-- obsoleted syntax.
--
-- So, use GHC other than 7.0.1 and specify the dollor sign for
-- portability.
module Text.Regex.Literal (re) where
import Data.String
import Language.Haskell.TH
import Language.Haskell.TH.Quote
import Text.Regex.Base
{-|
A 'QuasiQuoter' function to implement regular expression literal.
-}
re :: QuasiQuoter
#if __GLASGOW_HASKELL__ >= 700
re = QuasiQuoter parseExprExp parseExprPat parseExprType parseExprDec
#else
re = QuasiQuoter parseExprExp parseExprPat
#endif
parseExprExp :: String -> ExpQ
parseExprExp x = return . LitE . StringL $ x
parseExprPat :: String -> PatQ
parseExprPat = undefined
#if __GLASGOW_HASKELL__ >= 700
parseExprType :: String -> TypeQ
parseExprType = undefined
parseExprDec :: String -> Q [Dec]
parseExprDec = undefined
#endif
instance (RegexMaker regex compOpt execOpt String) => IsString regex where
fromString s = make s
where
make :: (RegexMaker regex compOpt execOpt String) => String -> regex
make = makeRegex