module Regexdo.Pcre.Option (
      Comp(..),
      Exec(..),
      comp,
      exec
   ) where

import Data.Bits
import qualified Text.Regex.PCRE.ByteString as B


data Comp = Blank       -- ^ 'B.compBlank'
            | Anchored  -- ^ 'B.compAnchored'
            | Caseless  -- ^ 'B.compCaseless'
            | Dotall    -- ^ 'B.compDotAll'
            | Multiline -- ^ 'B.compMultiline'
            | Utf8      -- ^ 'B.compUTF8'
            | Ungreedy  -- ^ 'B.compUngreedy'
   deriving Enum


data Exec = BlankE  -- ^ 'B.execBlank'
            | NotEmpty  -- ^ 'B.execNotEmpty'
            | Partial   -- ^ 'B.execPartial'
   deriving Enum


compOpt::Comp -> B.CompOption
compOpt o = case o of
   Blank -> B.compBlank
   Anchored -> B.compAnchored
   Caseless -> B.compCaseless
   Dotall -> B.compDotAll
   Multiline -> B.compMultiline
   Utf8 -> B.compUTF8
   Ungreedy -> B.compUngreedy


comp::[Comp] -> B.CompOption
comp [] = B.compBlank
comp l = foldl (.&.) o0 l1
   where l1 = compOpt <$> l
         o0 = compOpt $ head l


execOpt::Exec -> B.ExecOption
execOpt o =   case o of
   BlankE -> B.execBlank
   NotEmpty -> B.execNotEmpty
   Partial -> B.execPartial


exec::[Exec] -> B.ExecOption
exec [] = B.execBlank
exec l = foldl (.&.) o0 l1
   where l1 = execOpt <$> l
         o0 = execOpt $ head l