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