{- copyright (c) sreservoir.
   license bsd three-clause. -}

{-# LANGUAGE FlexibleInstances,TypeSynonymInstances #-}

module Text.Regex.Less.Quackers (QLR(..)) where

import qualified Text.Regex.PCRE as R
import Text.Regex.Less.REOpts

-- the QLR (QuacksLikeRegex) class:
  -- compile
-- instances of QLR:
  -- String
  -- (String,[RECtOpts])
  -- (String,[RERtOpts])
  -- (String,([RECtOpts],[RERtOpts]))
  -- (String,([RERtOpts],[RECtOpts]))
  -- ((String,[RECtOpts]),[RERtOpts])
  -- ((String,[RERtOpts]),[RECtOpts])

-- QuacksLikeRegex: can =~ .
class QLR a where
  compile :: a -> R.Regex

instance QLR String where
  compile a = R.makeRegexOpts (reCtOpts []) (reRtOpts []) a

instance QLR (String,[RECtOpts]) where
  compile (a,b) = R.makeRegexOpts (reCtOpts b) (reRtOpts []) a

instance QLR (String,[RERtOpts]) where
  compile (a,b) = R.makeRegexOpts (reCtOpts []) (reRtOpts b) a

instance QLR ((String,[RECtOpts]),[RERtOpts]) where
  compile ((a,b),c) = R.makeRegexOpts (reCtOpts b) (reRtOpts c) a

instance QLR ((String,[RERtOpts]),[RECtOpts]) where
  compile ((a,b),c) = R.makeRegexOpts (reCtOpts c) (reRtOpts b) a

instance QLR (String,([RECtOpts],[RERtOpts])) where
  compile (a,(b,c)) = R.makeRegexOpts (reCtOpts b) (reRtOpts c) a

instance QLR (String,([RERtOpts],[RECtOpts])) where
  compile (a,(b,c)) = R.makeRegexOpts (reCtOpts c) (reRtOpts b) a