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

module Text.Regex.Less ((=~),(<<),truth,subs,derefs,bref) where

import qualified Text.Regex.PCRE as R
import qualified Data.Array as A
import Text.Regex.Less.Quackers

type Result = (String,[R.MatchArray])

-- standard usage:
  --  "" =~ ""
  --  "" =~ "" << RECtOpts
  --  "" =~ "" << RERtOpts
  --  "" =~ "" << RECtOpts << RERtOpts
-- value suitable for use below.
infixl 4 =~
(=~) :: QLR a => String -> a -> Result
a =~ b = a << R.matchAll (compile b) a

infixl 5 <<
(<<) :: a -> b -> (a,b)
a << b = (a,b)

truth :: Result -> Bool
truth (_,a) = not (null a)

subs :: Result -> String -> String
subs a b = s ++ derefs a b ++ f
  where o = fst a
        (i,c) = head (snd a) A.! 0
        (s,r) = splitAt i o
        f = drop c r

derefs :: Result -> String -> String
derefs a ('^':'^':bs) = '^' : derefs a bs
derefs a ('^':bs)     =
  case reads bs of
    [(c,d)] -> bref a c ++ derefs a d
    _       -> undefined
derefs a (b:bs)       = b : derefs a bs
derefs _ []           = []

bref :: Result -> Int -> String
bref a i = R.extract (head (snd a) A.! i) (fst a)