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])
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)