{-# LANGUAGE FlexibleContexts, FlexibleInstances, UndecidableInstances, CPP #-}
{-# OPTIONS -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 #- }
>    -- Due to Haddock limitation, spaces are inserted after and before "}".
>    -- Remove them if you copy this.
>
>    import Text.Regex.Literal
>    import Text.Regex.Posix
>
>    -- Regular expression as the regular expression literal
>    regexp :: Regex
>    regexp = [$re|\\(foo)\\(bar\.c)|]
>
>    -- 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