-----------------------------------------------------------------------------
-- |
-- Module      :  Lambdabot.Regex
-- Copyright   :  (c) Don Stewart 2007
-- License     :  GPL (see LICENSE)
--
-- Maintainer  :  dons@galois.com
--
-----------------------------------------------------------------------------

module Lambdabot.Regex (
        -- ByteString interface
        regex,      -- :: ByteString -> Regex
        matches,    -- :: Regex -> ByteString -> Bool

        -- String interface
        regex',     -- :: String -> Regex
        matches',   -- :: Regex -> String -> Bool

        -- and the underlying module
        module Text.Regex.Posix.ByteString

    ) where

import Data.ByteString.Char8

import Text.Regex.Posix.ByteString
import System.IO.Unsafe (unsafePerformIO)

------------------------------------------------------------------------
--
-- convenient regex wrappers:
--

regex'   ::     String -> Regex
regex    :: ByteString -> Regex

matches' :: Regex ->     String -> Bool
matches  :: Regex -> ByteString -> Bool

------------------------------------------------------------------------

-- For ghc 6.6 we use the regex-posix bytestring library

regex' s = regex (pack s)

regex p = unsafePerformIO $ do
    res <- compile compileFlags execFlags p
    case res of
        Left  err -> error $ "regex failed: " ++ show err
        Right r   -> return r
  where
    compileFlags = compExtended
    execFlags    = 0

-- match a regex against a string or bytestring
matches' r s = matches r (pack s)

matches r p = unsafePerformIO $ do
    res <- execute r p
    case res of
        Left err       -> error $ "regex execute failed: " ++ show err
        Right Nothing  -> return False
        Right (Just _) -> return True