{-# LANGUAGE BangPatterns #-}
module Text.Regex.XMLSchema.Generic.Matching
( grep
, grepExt
, grepRE
, grepREwithLineNum
, match
, matchExt
, matchSubex
, sed
, sedExt
, split
, splitExt
, splitSubex
, tokenize
, tokenizeExt
, tokenize'
, tokenizeExt'
, tokenizeSubex
, matchRE
, matchSubexRE
, sedRE
, splitRE
, splitSubexRE
, tokenizeRE
, tokenizeRE'
, tokenizeSubexRE
)
where
import Control.Arrow
import Data.Maybe
import Text.Regex.XMLSchema.Generic.Regex
import Text.Regex.XMLSchema.Generic.RegexParser
import Text.Regex.XMLSchema.Generic.StringLike
splitRE :: StringLike s => GenRegex s -> s -> Maybe (s, s)
splitRE :: forall s. StringLike s => GenRegex s -> s -> Maybe (s, s)
splitRE GenRegex s
re s
input
= do
(SubexResults s
sms, s
rest) <- forall s.
StringLike s =>
GenRegex s -> s -> Maybe (SubexResults s, s)
splitWithRegex GenRegex s
re s
input
forall (m :: * -> *) a. Monad m => a -> m a
return (forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> a
head forall a b. (a -> b) -> a -> b
$ SubexResults s
sms, s
rest)
split :: StringLike s => s -> s -> (s, s)
split :: forall s. StringLike s => s -> s -> (s, s)
split = forall s. StringLike s => (s -> GenRegex s) -> s -> s -> (s, s)
split' forall s. StringLike s => s -> GenRegex s
parseRegex
splitExt :: StringLike s => s -> s -> (s, s)
splitExt :: forall s. StringLike s => s -> s -> (s, s)
splitExt = forall s. StringLike s => (s -> GenRegex s) -> s -> s -> (s, s)
split' forall s. StringLike s => s -> GenRegex s
parseRegexExt
split' :: StringLike s => (s -> GenRegex s) -> s -> s -> (s, s)
split' :: forall s. StringLike s => (s -> GenRegex s) -> s -> s -> (s, s)
split' s -> GenRegex s
parseRe s
re s
input
= forall a. a -> Maybe a -> a
fromMaybe (forall a. StringLike a => a
emptyS, s
input)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall s. StringLike s => GenRegex s -> s -> Maybe (s, s)
splitRE forall b c a. (b -> c) -> (a -> b) -> a -> c
. s -> GenRegex s
parseRe forall a b. (a -> b) -> a -> b
$ s
re) forall a b. (a -> b) -> a -> b
$ s
input
splitSubexRE :: StringLike s => GenRegex s -> s -> Maybe ([(s, s)], s)
splitSubexRE :: forall s. StringLike s => GenRegex s -> s -> Maybe ([(s, s)], s)
splitSubexRE GenRegex s
re s
input
= do
(SubexResults s
sms, s
rest) <- forall s.
StringLike s =>
GenRegex s -> s -> Maybe (SubexResults s, s)
splitWithRegex GenRegex s
re s
input
forall (m :: * -> *) a. Monad m => a -> m a
return (forall a b. (a -> b) -> [a] -> [b]
map (forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first forall a. HasCallStack => Maybe a -> a
fromJust) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Int -> [a] -> [a]
drop Int
1 forall a b. (a -> b) -> a -> b
$ SubexResults s
sms, s
rest)
splitSubex :: StringLike s => s -> s -> ([(s, s)], s)
splitSubex :: forall s. StringLike s => s -> s -> ([(s, s)], s)
splitSubex s
re s
inp
= forall a. a -> Maybe a -> a
fromMaybe ([], s
inp) forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall s. StringLike s => GenRegex s -> s -> Maybe ([(s, s)], s)
splitSubexRE forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s. StringLike s => s -> GenRegex s
parseRegexExt forall a b. (a -> b) -> a -> b
$ s
re) forall a b. (a -> b) -> a -> b
$ s
inp
tokenizeRE :: StringLike s => GenRegex s -> s -> [s]
tokenizeRE :: forall s. StringLike s => GenRegex s -> s -> [s]
tokenizeRE GenRegex s
re
= s -> [s]
token''
where
fcs :: CharSet
fcs = forall s. StringLike s => GenRegex s -> CharSet
firstChars GenRegex s
re
re1 :: GenRegex s
re1 = forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkDiff GenRegex s
re forall s. GenRegex s
mkUnit
token'' :: s -> [s]
token'' = GenRegex s -> CharSet -> s -> [s]
token' GenRegex s
re CharSet
fcs
token1'' :: s -> [s]
token1'' = GenRegex s -> CharSet -> s -> [s]
token' GenRegex s
re1 CharSet
fcs
token' :: GenRegex s -> CharSet -> s -> [s]
token' GenRegex s
re' CharSet
fcs' s
inp
| forall a. StringLike a => a -> Bool
nullS s
inp = []
| Bool
otherwise = forall {a}. Maybe ([(a, s)], s) -> [s]
evalRes forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s.
StringLike s =>
GenRegex s -> CharSet -> s -> Maybe (SubexResults s, s)
splitWithRegexCS GenRegex s
re' CharSet
fcs' forall a b. (a -> b) -> a -> b
$ s
inp
where
evalRes :: Maybe ([(a, s)], s) -> [s]
evalRes Maybe ([(a, s)], s)
Nothing
= s -> [s]
token'' (forall a. StringLike a => Int -> a -> a
dropS Int
1 s
inp)
evalRes (Just ([(a, s)]
toks, s
rest))
| forall a. StringLike a => a -> Bool
nullS s
tok = s
tok forall a. a -> [a] -> [a]
: s -> [s]
token'' (forall a. StringLike a => Int -> a -> a
dropS Int
1 s
rest)
| Bool
otherwise = s
tok forall a. a -> [a] -> [a]
: s -> [s]
token1'' s
rest
where
tok :: s
tok = forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> a
head forall a b. (a -> b) -> a -> b
$ [(a, s)]
toks
tokenize :: StringLike s => s -> s -> [s]
tokenize :: forall s. StringLike s => s -> s -> [s]
tokenize = forall s. StringLike s => GenRegex s -> s -> [s]
tokenizeRE forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s. StringLike s => s -> GenRegex s
parseRegex
tokenizeExt :: StringLike s => s -> s -> [s]
tokenizeExt :: forall s. StringLike s => s -> s -> [s]
tokenizeExt = forall s. StringLike s => GenRegex s -> s -> [s]
tokenizeRE forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s. StringLike s => s -> GenRegex s
parseRegexExt
tokenizeRE' :: StringLike s => GenRegex s -> s -> [Either s s]
tokenizeRE' :: forall s. StringLike s => GenRegex s -> s -> [Either s s]
tokenizeRE' GenRegex s
re s
inp0
= (s, Int) -> s -> [Either s s]
token'' (s
inp0, Int
0) s
inp0
where
fcs :: CharSet
fcs = forall s. StringLike s => GenRegex s -> CharSet
firstChars GenRegex s
re
re1 :: GenRegex s
re1 = forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkDiff GenRegex s
re forall s. GenRegex s
mkUnit
token'' :: (s, Int) -> s -> [Either s s]
token'' = GenRegex s -> CharSet -> (s, Int) -> s -> [Either s s]
token' GenRegex s
re CharSet
fcs
token1'' :: (s, Int) -> s -> [Either s s]
token1'' = GenRegex s -> CharSet -> (s, Int) -> s -> [Either s s]
token' GenRegex s
re1 CharSet
fcs
token' :: GenRegex s -> CharSet -> (s, Int) -> s -> [Either s s]
token' GenRegex s
re' CharSet
fcs' (s
uns, !Int
n) s
inp
| forall a. StringLike a => a -> Bool
nullS s
inp = forall {b}. [Either s b] -> [Either s b]
addUnmatched []
| Bool
otherwise = forall {a}. Maybe ([(a, s)], s) -> [Either s s]
evalRes forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s.
StringLike s =>
GenRegex s -> CharSet -> s -> Maybe (SubexResults s, s)
splitWithRegexCS GenRegex s
re' CharSet
fcs' forall a b. (a -> b) -> a -> b
$ s
inp
where
addUnmatched :: [Either s b] -> [Either s b]
addUnmatched
| Int
n forall a. Eq a => a -> a -> Bool
== Int
0 = forall a. a -> a
id
| Bool
otherwise = ((forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ forall a. StringLike a => Int -> a -> a
takeS Int
n s
uns) forall a. a -> [a] -> [a]
:)
addMatched :: b -> [Either s b] -> [Either s b]
addMatched b
t
= forall {b}. [Either s b] -> [Either s b]
addUnmatched forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((forall a b. b -> Either a b
Right b
t) forall a. a -> [a] -> [a]
:)
evalRes :: Maybe ([(a, s)], s) -> [Either s s]
evalRes Maybe ([(a, s)], s)
Nothing
= (s, Int) -> s -> [Either s s]
token'' (s
uns, Int
n forall a. Num a => a -> a -> a
+ Int
1) (forall a. StringLike a => Int -> a -> a
dropS Int
1 s
inp)
evalRes (Just ([(a, s)]
toks, s
rest))
| forall a. StringLike a => a -> Bool
nullS s
tok = forall {b}. b -> [Either s b] -> [Either s b]
addMatched s
tok
forall a b. (a -> b) -> a -> b
$ (s, Int) -> s -> [Either s s]
token'' (s
rest, Int
1)
(forall a. StringLike a => Int -> a -> a
dropS Int
1 s
rest)
| Bool
otherwise = forall {b}. b -> [Either s b] -> [Either s b]
addMatched s
tok
forall a b. (a -> b) -> a -> b
$ (s, Int) -> s -> [Either s s]
token1'' (s
rest, Int
0) s
rest
where
tok :: s
tok = forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> a
head forall a b. (a -> b) -> a -> b
$ [(a, s)]
toks
tokenize' :: StringLike s => s -> s -> [Either s s]
tokenize' :: forall s. StringLike s => s -> s -> [Either s s]
tokenize' = forall s. StringLike s => GenRegex s -> s -> [Either s s]
tokenizeRE' forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s. StringLike s => s -> GenRegex s
parseRegex
tokenizeExt' :: StringLike s => s -> s -> [Either s s]
tokenizeExt' :: forall s. StringLike s => s -> s -> [Either s s]
tokenizeExt' = forall s. StringLike s => GenRegex s -> s -> [Either s s]
tokenizeRE' forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s. StringLike s => s -> GenRegex s
parseRegexExt
tokenizeSubexRE :: StringLike s => GenRegex s -> s -> [(s, s)]
tokenizeSubexRE :: forall s. StringLike s => GenRegex s -> s -> [(s, s)]
tokenizeSubexRE GenRegex s
re
= s -> [(s, s)]
token''
where
fcs :: CharSet
fcs = forall s. StringLike s => GenRegex s -> CharSet
firstChars GenRegex s
re
re1 :: GenRegex s
re1 = forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkDiff GenRegex s
re forall s. GenRegex s
mkUnit
token'' :: s -> [(s, s)]
token'' = GenRegex s -> CharSet -> s -> [(s, s)]
token' GenRegex s
re CharSet
fcs
token1'' :: s -> [(s, s)]
token1'' = GenRegex s -> CharSet -> s -> [(s, s)]
token' GenRegex s
re1 CharSet
fcs
token' :: GenRegex s -> CharSet -> s -> [(s, s)]
token' GenRegex s
re' CharSet
fcs' s
inp
| forall a. StringLike a => a -> Bool
nullS s
inp = []
| Bool
otherwise = Maybe ([(Maybe s, s)], s) -> [(s, s)]
evalRes forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s.
StringLike s =>
GenRegex s -> CharSet -> s -> Maybe (SubexResults s, s)
splitWithRegexCS GenRegex s
re' CharSet
fcs' forall a b. (a -> b) -> a -> b
$ s
inp
where
evalRes :: Maybe ([(Maybe s, s)], s) -> [(s, s)]
evalRes Maybe ([(Maybe s, s)], s)
Nothing
= s -> [(s, s)]
token'' (forall a. StringLike a => Int -> a -> a
dropS Int
1 s
inp)
evalRes (Just ([(Maybe s, s)]
toks, s
rest))
| forall a. StringLike a => a -> Bool
nullS s
tok = [(s, s)]
res forall a. [a] -> [a] -> [a]
++ s -> [(s, s)]
token'' (forall a. StringLike a => Int -> a -> a
dropS Int
1 s
rest)
| Bool
otherwise = [(s, s)]
res forall a. [a] -> [a] -> [a]
++ s -> [(s, s)]
token1'' s
rest
where
res :: [(s, s)]
res = forall a b. (a -> b) -> [a] -> [b]
map (forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first forall a. HasCallStack => Maybe a -> a
fromJust) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> [a]
tail forall a b. (a -> b) -> a -> b
$ [(Maybe s, s)]
toks
tok :: s
tok = forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> a
head forall a b. (a -> b) -> a -> b
$ [(Maybe s, s)]
toks
tokenizeSubex :: StringLike s => s -> s -> [(s, s)]
tokenizeSubex :: forall s. StringLike s => s -> s -> [(s, s)]
tokenizeSubex = forall s. StringLike s => GenRegex s -> s -> [(s, s)]
tokenizeSubexRE forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s. StringLike s => s -> GenRegex s
parseRegexExt
sedRE :: StringLike s => (s -> s) -> GenRegex s -> s -> s
sedRE :: forall s. StringLike s => (s -> s) -> GenRegex s -> s -> s
sedRE s -> s
edit GenRegex s
re = forall a. StringLike a => [a] -> a
concatS forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall a. a -> a
id s -> s
edit) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s. StringLike s => GenRegex s -> s -> [Either s s]
tokenizeRE' GenRegex s
re
sed :: StringLike s => (s -> s) -> s -> s -> s
sed :: forall s. StringLike s => (s -> s) -> s -> s -> s
sed s -> s
edit = forall s. StringLike s => (s -> s) -> GenRegex s -> s -> s
sedRE s -> s
edit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s. StringLike s => s -> GenRegex s
parseRegex
sedExt :: StringLike s => (s -> s) -> s -> s -> s
sedExt :: forall s. StringLike s => (s -> s) -> s -> s -> s
sedExt s -> s
edit = forall s. StringLike s => (s -> s) -> GenRegex s -> s -> s
sedRE s -> s
edit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s. StringLike s => s -> GenRegex s
parseRegexExt
matchRE :: StringLike s => GenRegex s -> s -> Bool
matchRE :: forall s. StringLike s => GenRegex s -> s -> Bool
matchRE = forall s. StringLike s => GenRegex s -> s -> Bool
matchWithRegex
match :: StringLike s => s -> s -> Bool
match :: forall s. StringLike s => s -> s -> Bool
match = forall s. StringLike s => GenRegex s -> s -> Bool
matchWithRegex forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s. StringLike s => s -> GenRegex s
parseRegex
matchExt :: StringLike s => s -> s -> Bool
matchExt :: forall s. StringLike s => s -> s -> Bool
matchExt = forall s. StringLike s => GenRegex s -> s -> Bool
matchWithRegex forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s. StringLike s => s -> GenRegex s
parseRegexExt
matchSubexRE :: StringLike s => GenRegex s -> s -> [(s, s)]
matchSubexRE :: forall s. StringLike s => GenRegex s -> s -> [(s, s)]
matchSubexRE GenRegex s
re = forall a b. (a -> b) -> [a] -> [b]
map (forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first forall a. HasCallStack => Maybe a -> a
fromJust) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> Maybe a -> a
fromMaybe [] forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s. StringLike s => GenRegex s -> s -> Maybe (SubexResults s)
matchWithRegex' GenRegex s
re
matchSubex :: StringLike s => s -> s -> [(s, s)]
matchSubex :: forall s. StringLike s => s -> s -> [(s, s)]
matchSubex = forall s. StringLike s => GenRegex s -> s -> [(s, s)]
matchSubexRE forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s. StringLike s => s -> GenRegex s
parseRegexExt
grep :: StringLike s => s -> [s] -> [s]
grep :: forall s. StringLike s => s -> [s] -> [s]
grep = forall s. StringLike s => (String -> GenRegex s) -> s -> [s] -> [s]
grep' forall s. StringLike s => String -> GenRegex s
parseRegex'
grepExt :: StringLike s => s -> [s] -> [s]
grepExt :: forall s. StringLike s => s -> [s] -> [s]
grepExt = forall s. StringLike s => (String -> GenRegex s) -> s -> [s] -> [s]
grep' forall s. StringLike s => String -> GenRegex s
parseRegexExt'
grep' :: StringLike s => (String -> GenRegex s) -> s -> [s] -> [s]
grep' :: forall s. StringLike s => (String -> GenRegex s) -> s -> [s] -> [s]
grep' String -> GenRegex s
parseRe = forall s. StringLike s => GenRegex s -> [s] -> [s]
grepRE forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s. StringLike s => (String -> GenRegex s) -> s -> GenRegex s
parseContextRegex String -> GenRegex s
parseRe
grepRE :: StringLike s => GenRegex s-> [s] -> [s]
grepRE :: forall s. StringLike s => GenRegex s -> [s] -> [s]
grepRE GenRegex s
re = forall a. (a -> Bool) -> [a] -> [a]
filter (forall s. StringLike s => GenRegex s -> s -> Bool
matchRE GenRegex s
re)
grepREwithLineNum :: StringLike s => GenRegex s -> [s] -> [(Int, s)]
grepREwithLineNum :: forall s. StringLike s => GenRegex s -> [s] -> [(Int, s)]
grepREwithLineNum GenRegex s
re = forall a. (a -> Bool) -> [a] -> [a]
filter (forall s. StringLike s => GenRegex s -> s -> Bool
matchRE GenRegex s
re forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> b
snd) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. [a] -> [b] -> [(a, b)]
zip [(Int
1::Int)..]