module Text.Regex.Do.Type.Regex_ where

import qualified Text.Regex.Base.RegexLike as R
import Text.Regex.Do.Type.Reexport
import Data.ByteString
import Text.Regex.Do.Type.Do
import Text.Regex.Do.Pcre.Option


class Regex_ a where
   r_::Pattern a -> Regex
   ropt_::Pattern a -> [Comp] -> [Exec] -> Regex


instance Regex_ ByteString where
   r_ (Pattern p0) = R.makeRegex p0
   ropt_ = makeRegexOpts

instance Regex_ String where
   r_ (Pattern p0) = R.makeRegex p0
   ropt_ = makeRegexOpts

instance Regex_ Regex where
   r_ (Pattern p0) = p0
   ropt_ (Pattern p0) _ _ = p0


type Rx_ a b = (Regex_ a, R.Extract b, R.RegexLike Regex b)
type Opt_ a = R.RegexMaker Regex CompOption ExecOption a


-- | tweak Regex with options
makeRegexOpts::Opt_ a =>
    Pattern a ->
        [Comp] -> [Exec] ->
            Regex
makeRegexOpts (Pattern pat0) comp0 exec0 = rx1
   where c1 = comp comp0
         e1 = exec exec0
         rx1 = R.makeRegexOpts c1 e1 pat0