{-# LANGUAGE CPP #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE FlexibleInstances #-}
module Text.Regex.XMLSchema.Generic.Regex
( GenRegex
, mkZero
, mkZero'
, mkUnit
, mkSym
, mkSym1
, mkSymRng
, mkWord
, mkDot
, mkStar
, mkAll
, mkAlt
, mkElse
, mkSeq
, mkSeqs
, mkRep
, mkRng
, mkOpt
, mkDiff
, mkIsect
, mkExor
, mkInterleave
, mkCompl
, mkBr
, mkBr'
, isZero
, errRegex
, nullable
, nullable'
, delta1
, delta
, firstChars
, matchWithRegex
, matchWithRegex'
, splitWithRegex
, splitWithRegex'
, splitWithRegexCS
, splitWithRegexCS'
)
where
import Data.List (intercalate)
import Data.Set.CharSet
import Data.String (IsString(..))
#if MIN_VERSION_base(4,13,0)
#else
import Data.Monoid ((<>))
#endif
import Text.Regex.XMLSchema.Generic.StringLike
data GenRegex s
= Zero s
| Unit
| Sym CharSet
| Dot
| Star (GenRegex s)
| Alt (GenRegex s) (GenRegex s)
| Else (GenRegex s) (GenRegex s)
| Seq (GenRegex s) (GenRegex s)
| Rep Int (GenRegex s)
| Rng Int Int (GenRegex s)
| Diff (GenRegex s) (GenRegex s)
| Isec (GenRegex s) (GenRegex s)
| Exor (GenRegex s) (GenRegex s)
| Intl (GenRegex s) (GenRegex s)
| Br (Label s) (GenRegex s)
| Obr (Label s) s !Int (GenRegex s)
| Cbr [(Label s, s)] (GenRegex s)
deriving (GenRegex s -> GenRegex s -> Bool
forall s. Eq s => GenRegex s -> GenRegex s -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GenRegex s -> GenRegex s -> Bool
$c/= :: forall s. Eq s => GenRegex s -> GenRegex s -> Bool
== :: GenRegex s -> GenRegex s -> Bool
$c== :: forall s. Eq s => GenRegex s -> GenRegex s -> Bool
Eq, GenRegex s -> GenRegex s -> Ordering
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall {s}. Ord s => Eq (GenRegex s)
forall s. Ord s => GenRegex s -> GenRegex s -> Bool
forall s. Ord s => GenRegex s -> GenRegex s -> Ordering
forall s. Ord s => GenRegex s -> GenRegex s -> GenRegex s
min :: GenRegex s -> GenRegex s -> GenRegex s
$cmin :: forall s. Ord s => GenRegex s -> GenRegex s -> GenRegex s
max :: GenRegex s -> GenRegex s -> GenRegex s
$cmax :: forall s. Ord s => GenRegex s -> GenRegex s -> GenRegex s
>= :: GenRegex s -> GenRegex s -> Bool
$c>= :: forall s. Ord s => GenRegex s -> GenRegex s -> Bool
> :: GenRegex s -> GenRegex s -> Bool
$c> :: forall s. Ord s => GenRegex s -> GenRegex s -> Bool
<= :: GenRegex s -> GenRegex s -> Bool
$c<= :: forall s. Ord s => GenRegex s -> GenRegex s -> Bool
< :: GenRegex s -> GenRegex s -> Bool
$c< :: forall s. Ord s => GenRegex s -> GenRegex s -> Bool
compare :: GenRegex s -> GenRegex s -> Ordering
$ccompare :: forall s. Ord s => GenRegex s -> GenRegex s -> Ordering
Ord )
type Label s
= Maybe s
type SubexResults s
= [(Label s, s)]
type Nullable s
= (Bool, SubexResults s)
mkZero :: s -> GenRegex s
mkZero :: forall s. s -> GenRegex s
mkZero = forall s. s -> GenRegex s
Zero
{-# INLINE mkZero #-}
mkZero' :: (StringLike s) =>
String -> GenRegex s
mkZero' :: forall s. StringLike s => String -> GenRegex s
mkZero' = forall s. s -> GenRegex s
Zero forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. IsString a => String -> a
fromString
{-# INLINE mkZero' #-}
mkUnit :: GenRegex s
mkUnit :: forall s. GenRegex s
mkUnit = forall s. GenRegex s
Unit
{-# INLINE mkUnit #-}
mkSym :: (StringLike s) =>
CharSet -> GenRegex s
mkSym :: forall s. StringLike s => CharSet -> GenRegex s
mkSym CharSet
s
| CharSet -> Bool
nullCS CharSet
s = forall s. StringLike s => String -> GenRegex s
mkZero' String
"empty char range"
| CharSet -> Bool
fullCS CharSet
s = forall s. GenRegex s
mkDot
| Bool
otherwise = forall s. CharSet -> GenRegex s
Sym CharSet
s
{-# INLINE mkSym #-}
mkSym1 :: (StringLike s) =>
Char -> GenRegex s
mkSym1 :: forall s. StringLike s => Char -> GenRegex s
mkSym1 = forall s. StringLike s => CharSet -> GenRegex s
mkSym forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> CharSet
singleCS
{-# INLINE mkSym1 #-}
mkSymRng :: (StringLike s) =>
Char -> Char -> GenRegex s
mkSymRng :: forall s. StringLike s => Char -> Char -> GenRegex s
mkSymRng Char
c1 Char
c2 = forall s. StringLike s => CharSet -> GenRegex s
mkSym forall a b. (a -> b) -> a -> b
$ Char -> Char -> CharSet
rangeCS Char
c1 Char
c2
{-# INLINE mkSymRng #-}
mkWord :: (StringLike s) =>
[Char] -> GenRegex s
mkWord :: forall s. StringLike s => String -> GenRegex s
mkWord = forall s. [GenRegex s] -> GenRegex s
mkSeqs forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall s. StringLike s => Char -> GenRegex s
mkSym1
mkDot :: GenRegex s
mkDot :: forall s. GenRegex s
mkDot = forall s. GenRegex s
Dot
{-# INLINE mkDot #-}
mkAll :: (StringLike s) =>
GenRegex s
mkAll :: forall s. StringLike s => GenRegex s
mkAll = forall s. StringLike s => GenRegex s -> GenRegex s
mkStar forall s. GenRegex s
mkDot
{-# INLINE mkAll #-}
mkStar :: (StringLike s) =>
GenRegex s -> GenRegex s
mkStar :: forall s. StringLike s => GenRegex s -> GenRegex s
mkStar (Zero s
_) = forall s. GenRegex s
mkUnit
mkStar e :: GenRegex s
e@GenRegex s
Unit = GenRegex s
e
mkStar e :: GenRegex s
e@(Star GenRegex s
_e1) = GenRegex s
e
mkStar (Rep Int
1 GenRegex s
e1) = forall s. StringLike s => GenRegex s -> GenRegex s
mkStar GenRegex s
e1
mkStar (Rep Int
i GenRegex s
e1)
| Int
i forall a. Eq a => a -> a -> Bool
== Int
1
Bool -> Bool -> Bool
||
forall s. StringLike s => GenRegex s -> Bool
nullable GenRegex s
e1 = forall s. StringLike s => GenRegex s -> GenRegex s
mkStar GenRegex s
e1
mkStar e :: GenRegex s
e@(Rng Int
_ Int
_ GenRegex s
e1)
| forall s. StringLike s => GenRegex s -> Bool
nullable GenRegex s
e = forall s. StringLike s => GenRegex s -> GenRegex s
mkStar GenRegex s
e1
mkStar e :: GenRegex s
e@(Alt GenRegex s
_ GenRegex s
_) = forall s. GenRegex s -> GenRegex s
Star (forall s. StringLike s => GenRegex s -> GenRegex s
rmStar GenRegex s
e)
mkStar GenRegex s
e = forall s. GenRegex s -> GenRegex s
Star GenRegex s
e
rmStar :: (StringLike s) =>
GenRegex s -> GenRegex s
rmStar :: forall s. StringLike s => GenRegex s -> GenRegex s
rmStar (Alt GenRegex s
e1 GenRegex s
e2) = forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkAlt (forall s. StringLike s => GenRegex s -> GenRegex s
rmStar GenRegex s
e1) (forall s. StringLike s => GenRegex s -> GenRegex s
rmStar GenRegex s
e2)
rmStar (Star GenRegex s
e1) = forall s. StringLike s => GenRegex s -> GenRegex s
rmStar GenRegex s
e1
rmStar (Rep Int
1 GenRegex s
e1) = forall s. StringLike s => GenRegex s -> GenRegex s
rmStar GenRegex s
e1
rmStar GenRegex s
e1 = GenRegex s
e1
mkAlt :: (StringLike s) =>
GenRegex s -> GenRegex s -> GenRegex s
mkAlt :: forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkAlt GenRegex s
e1 (Zero s
_) = GenRegex s
e1
mkAlt (Zero s
_) GenRegex s
e2 = GenRegex s
e2
mkAlt (Sym CharSet
p1) (Sym CharSet
p2) = forall s. StringLike s => CharSet -> GenRegex s
mkSym forall a b. (a -> b) -> a -> b
$ CharSet
p1 CharSet -> CharSet -> CharSet
`unionCS` CharSet
p2
mkAlt GenRegex s
e1 e2 :: GenRegex s
e2@(Sym CharSet
_) = forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkAlt GenRegex s
e2 GenRegex s
e1
mkAlt e1 :: GenRegex s
e1@(Sym CharSet
_) (Alt e2 :: GenRegex s
e2@(Sym CharSet
_) GenRegex s
e3) = forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkAlt (forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkAlt GenRegex s
e1 GenRegex s
e2) GenRegex s
e3
mkAlt (Sym CharSet
_) e2 :: GenRegex s
e2@GenRegex s
Dot = GenRegex s
e2
mkAlt e1 :: GenRegex s
e1@(Star GenRegex s
Dot) GenRegex s
_e2 = GenRegex s
e1
mkAlt GenRegex s
_e1 e2 :: GenRegex s
e2@(Star GenRegex s
Dot) = GenRegex s
e2
mkAlt (Alt GenRegex s
e1 GenRegex s
e2) GenRegex s
e3 = forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkAlt GenRegex s
e1 (forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkAlt GenRegex s
e2 GenRegex s
e3)
mkAlt GenRegex s
e1 GenRegex s
e2
| GenRegex s
e1 forall a. Eq a => a -> a -> Bool
== GenRegex s
e2 = GenRegex s
e1
| Bool
otherwise = forall s. GenRegex s -> GenRegex s -> GenRegex s
Alt GenRegex s
e1 GenRegex s
e2
mkElse :: (StringLike s) =>
GenRegex s -> GenRegex s -> GenRegex s
mkElse :: forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkElse GenRegex s
e1 (Zero s
_) = GenRegex s
e1
mkElse (Zero s
_) GenRegex s
e2 = GenRegex s
e2
mkElse (Sym CharSet
p1) (Sym CharSet
p2) = forall s. StringLike s => CharSet -> GenRegex s
mkSym forall a b. (a -> b) -> a -> b
$ CharSet
p1 CharSet -> CharSet -> CharSet
`unionCS` CharSet
p2
mkElse e1 :: GenRegex s
e1@(Sym CharSet
_) (Else e2 :: GenRegex s
e2@(Sym CharSet
_) GenRegex s
e3) = forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkElse (forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkElse GenRegex s
e1 GenRegex s
e2) GenRegex s
e3
mkElse (Sym CharSet
_) e2 :: GenRegex s
e2@GenRegex s
Dot = GenRegex s
e2
mkElse e1 :: GenRegex s
e1@(Star GenRegex s
Dot) GenRegex s
_e2 = GenRegex s
e1
mkElse GenRegex s
_e1 e2 :: GenRegex s
e2@(Star GenRegex s
Dot) = GenRegex s
e2
mkElse (Else GenRegex s
e1 GenRegex s
e2) GenRegex s
e3 = forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkElse GenRegex s
e1 (forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkElse GenRegex s
e2 GenRegex s
e3)
mkElse GenRegex s
e1 GenRegex s
e2
| GenRegex s
e1 forall a. Eq a => a -> a -> Bool
== GenRegex s
e2 = GenRegex s
e1
| Bool
otherwise = forall s. GenRegex s -> GenRegex s -> GenRegex s
Else GenRegex s
e1 GenRegex s
e2
mkSeq :: GenRegex s -> GenRegex s -> GenRegex s
mkSeq :: forall s. GenRegex s -> GenRegex s -> GenRegex s
mkSeq e1 :: GenRegex s
e1@(Zero s
_) GenRegex s
_e2 = GenRegex s
e1
mkSeq GenRegex s
_e1 e2 :: GenRegex s
e2@(Zero s
_) = GenRegex s
e2
mkSeq GenRegex s
Unit GenRegex s
e2 = GenRegex s
e2
mkSeq (Cbr [(Label s, s)]
ss1 GenRegex s
e1) GenRegex s
e2 = forall s. SubexResults s -> GenRegex s -> GenRegex s
mkCbr [(Label s, s)]
ss1 (forall s. GenRegex s -> GenRegex s -> GenRegex s
mkSeq GenRegex s
e1 GenRegex s
e2)
mkSeq GenRegex s
e1 GenRegex s
Unit = GenRegex s
e1
mkSeq (Seq GenRegex s
e1 GenRegex s
e2) GenRegex s
e3 = forall s. GenRegex s -> GenRegex s -> GenRegex s
mkSeq GenRegex s
e1 (forall s. GenRegex s -> GenRegex s -> GenRegex s
mkSeq GenRegex s
e2 GenRegex s
e3)
mkSeq GenRegex s
e1 GenRegex s
e2 = forall s. GenRegex s -> GenRegex s -> GenRegex s
Seq GenRegex s
e1 GenRegex s
e2
mkSeqs :: [GenRegex s] -> GenRegex s
mkSeqs :: forall s. [GenRegex s] -> GenRegex s
mkSeqs = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr forall s. GenRegex s -> GenRegex s -> GenRegex s
mkSeq forall s. GenRegex s
mkUnit
mkRep :: (StringLike s) =>
Int -> GenRegex s -> GenRegex s
mkRep :: forall s. StringLike s => Int -> GenRegex s -> GenRegex s
mkRep Int
0 GenRegex s
e = forall s. StringLike s => GenRegex s -> GenRegex s
mkStar GenRegex s
e
mkRep Int
_ e :: GenRegex s
e@(Zero s
_) = GenRegex s
e
mkRep Int
_ GenRegex s
e
| forall s. StringLike s => GenRegex s -> Bool
nullable GenRegex s
e = forall s. StringLike s => GenRegex s -> GenRegex s
mkStar GenRegex s
e
mkRep Int
i (Rep Int
j GenRegex s
e) = forall s. StringLike s => Int -> GenRegex s -> GenRegex s
mkRep (Int
i forall a. Num a => a -> a -> a
* Int
j) GenRegex s
e
mkRep Int
i GenRegex s
e = forall s. Int -> GenRegex s -> GenRegex s
Rep Int
i GenRegex s
e
mkRng :: (StringLike s) =>
Int -> Int -> GenRegex s -> GenRegex s
mkRng :: forall s. StringLike s => Int -> Int -> GenRegex s -> GenRegex s
mkRng Int
0 Int
0 GenRegex s
_e = forall s. GenRegex s
mkUnit
mkRng Int
1 Int
1 GenRegex s
e = GenRegex s
e
mkRng Int
lb Int
ub GenRegex s
_e
| Int
lb forall a. Ord a => a -> a -> Bool
> Int
ub = forall s. StringLike s => String -> GenRegex s
mkZero' forall a b. (a -> b) -> a -> b
$
String
"illegal range " forall a. [a] -> [a] -> [a]
++
forall a. Show a => a -> String
show Int
lb forall a. [a] -> [a] -> [a]
++ String
".." forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
ub
mkRng Int
_l Int
_u e :: GenRegex s
e@(Zero s
_) = GenRegex s
e
mkRng Int
_l Int
_u e :: GenRegex s
e@GenRegex s
Unit = GenRegex s
e
mkRng Int
lb Int
ub GenRegex s
e = forall s. Int -> Int -> GenRegex s -> GenRegex s
Rng Int
lb Int
ub GenRegex s
e
mkOpt :: (StringLike s) =>
GenRegex s -> GenRegex s
mkOpt :: forall s. StringLike s => GenRegex s -> GenRegex s
mkOpt = forall s. StringLike s => Int -> Int -> GenRegex s -> GenRegex s
mkRng Int
0 Int
1
{-# INLINE mkOpt #-}
mkDiff :: (StringLike s) =>
GenRegex s -> GenRegex s -> GenRegex s
mkDiff :: forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkDiff e1 :: GenRegex s
e1@(Zero s
_) GenRegex s
_e2 = GenRegex s
e1
mkDiff GenRegex s
e1 (Zero s
_) = GenRegex s
e1
mkDiff GenRegex s
_e1 (Star GenRegex s
Dot) = forall s. StringLike s => String -> GenRegex s
mkZero' String
"empty set in difference expr"
mkDiff GenRegex s
Dot (Sym CharSet
p) = forall s. StringLike s => CharSet -> GenRegex s
mkSym forall a b. (a -> b) -> a -> b
$ CharSet -> CharSet
compCS CharSet
p
mkDiff (Sym CharSet
_) GenRegex s
Dot = forall s. StringLike s => String -> GenRegex s
mkZero' String
"empty set in difference expr"
mkDiff (Sym CharSet
p1) (Sym CharSet
p2) = forall s. StringLike s => CharSet -> GenRegex s
mkSym forall a b. (a -> b) -> a -> b
$ CharSet
p1 CharSet -> CharSet -> CharSet
`diffCS` CharSet
p2
mkDiff GenRegex s
e1 GenRegex s
e2
| GenRegex s
e1 forall a. Eq a => a -> a -> Bool
== GenRegex s
e2 = forall s. StringLike s => String -> GenRegex s
mkZero' String
"empty set in difference expr"
| Bool
otherwise = forall s. GenRegex s -> GenRegex s -> GenRegex s
Diff GenRegex s
e1 GenRegex s
e2
mkCompl :: (StringLike s) =>
GenRegex s -> GenRegex s
mkCompl :: forall s. StringLike s => GenRegex s -> GenRegex s
mkCompl (Zero s
_) = forall s. StringLike s => GenRegex s
mkAll
mkCompl (Star GenRegex s
Dot) = forall s. StringLike s => String -> GenRegex s
mkZero' String
"empty set in compl expr"
mkCompl GenRegex s
e = forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkDiff (forall s. StringLike s => GenRegex s -> GenRegex s
mkStar forall s. GenRegex s
mkDot) GenRegex s
e
mkIsect :: (StringLike s) =>
GenRegex s -> GenRegex s -> GenRegex s
mkIsect :: forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkIsect e1 :: GenRegex s
e1@(Zero s
_) GenRegex s
_e2 = GenRegex s
e1
mkIsect GenRegex s
_e1 e2 :: GenRegex s
e2@(Zero s
_) = GenRegex s
e2
mkIsect e1 :: GenRegex s
e1@(GenRegex s
Unit) GenRegex s
e2
| forall s. StringLike s => GenRegex s -> Bool
nullable GenRegex s
e2 = GenRegex s
e1
| Bool
otherwise = forall s. StringLike s => String -> GenRegex s
mkZero' String
"intersection empty"
mkIsect GenRegex s
e1 e2 :: GenRegex s
e2@(GenRegex s
Unit) = forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkIsect GenRegex s
e2 GenRegex s
e1
mkIsect (Sym CharSet
p1) (Sym CharSet
p2) = forall s. StringLike s => CharSet -> GenRegex s
mkSym forall a b. (a -> b) -> a -> b
$ CharSet
p1 CharSet -> CharSet -> CharSet
`intersectCS` CharSet
p2
mkIsect e1 :: GenRegex s
e1@(Sym CharSet
_) GenRegex s
Dot = GenRegex s
e1
mkIsect GenRegex s
Dot e2 :: GenRegex s
e2@(Sym CharSet
_) = GenRegex s
e2
mkIsect (Star GenRegex s
Dot) GenRegex s
e2 = GenRegex s
e2
mkIsect GenRegex s
e1 (Star GenRegex s
Dot) = GenRegex s
e1
mkIsect GenRegex s
e1 GenRegex s
e2
| GenRegex s
e1 forall a. Eq a => a -> a -> Bool
== GenRegex s
e2 = GenRegex s
e1
| Bool
otherwise = forall s. GenRegex s -> GenRegex s -> GenRegex s
Isec GenRegex s
e1 GenRegex s
e2
mkExor :: (StringLike s) =>
GenRegex s -> GenRegex s -> GenRegex s
mkExor :: forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkExor (Zero s
_) GenRegex s
e2 = GenRegex s
e2
mkExor GenRegex s
e1 (Zero s
_) = GenRegex s
e1
mkExor (Star GenRegex s
Dot) GenRegex s
_e2 = forall s. StringLike s => String -> GenRegex s
mkZero' String
"empty set in exor expr"
mkExor GenRegex s
_e1 (Star GenRegex s
Dot) = forall s. StringLike s => String -> GenRegex s
mkZero' String
"empty set in exor expr"
mkExor (Sym CharSet
p1) (Sym CharSet
p2) = forall s. StringLike s => CharSet -> GenRegex s
mkSym forall a b. (a -> b) -> a -> b
$ CharSet
p1 CharSet -> CharSet -> CharSet
`exorCS` CharSet
p2
mkExor (Sym CharSet
p1) GenRegex s
Dot = forall s. StringLike s => CharSet -> GenRegex s
mkSym forall a b. (a -> b) -> a -> b
$ CharSet -> CharSet
compCS CharSet
p1
mkExor GenRegex s
Dot (Sym CharSet
p2) = forall s. StringLike s => CharSet -> GenRegex s
mkSym forall a b. (a -> b) -> a -> b
$ CharSet -> CharSet
compCS CharSet
p2
mkExor GenRegex s
e1 GenRegex s
e2
| GenRegex s
e1 forall a. Eq a => a -> a -> Bool
== GenRegex s
e2 = forall s. StringLike s => String -> GenRegex s
mkZero' String
"empty set in exor expr"
| Bool
otherwise = forall s. GenRegex s -> GenRegex s -> GenRegex s
Exor GenRegex s
e1 GenRegex s
e2
mkInterleave :: GenRegex s -> GenRegex s -> GenRegex s
mkInterleave :: forall s. GenRegex s -> GenRegex s -> GenRegex s
mkInterleave e1 :: GenRegex s
e1@(Zero s
_) GenRegex s
_ = GenRegex s
e1
mkInterleave GenRegex s
_ e2 :: GenRegex s
e2@(Zero s
_) = GenRegex s
e2
mkInterleave (GenRegex s
Unit) GenRegex s
e2 = GenRegex s
e2
mkInterleave GenRegex s
e1 (GenRegex s
Unit) = GenRegex s
e1
mkInterleave GenRegex s
e1 GenRegex s
e2 = forall s. GenRegex s -> GenRegex s -> GenRegex s
Intl GenRegex s
e1 GenRegex s
e2
mkBr :: s -> GenRegex s -> GenRegex s
mkBr :: forall s. s -> GenRegex s -> GenRegex s
mkBr s
l GenRegex s
e = forall s. Label s -> GenRegex s -> GenRegex s
Br (forall a. a -> Maybe a
Just s
l) GenRegex s
e
mkBr' :: StringLike s =>
String -> GenRegex s -> GenRegex s
mkBr' :: forall s. StringLike s => String -> GenRegex s -> GenRegex s
mkBr' String
l GenRegex s
e = forall s. Label s -> GenRegex s -> GenRegex s
Br (forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall a. IsString a => String -> a
fromString String
l) GenRegex s
e
mkBrN :: GenRegex s -> GenRegex s
mkBrN :: forall s. GenRegex s -> GenRegex s
mkBrN GenRegex s
e = forall s. Label s -> GenRegex s -> GenRegex s
Br forall a. Maybe a
Nothing GenRegex s
e
mkObr :: StringLike s =>
Label s -> s -> Int -> GenRegex s -> GenRegex s
mkObr :: forall s.
StringLike s =>
Label s -> s -> Int -> GenRegex s -> GenRegex s
mkObr Label s
_ s
_ Int
_ e :: GenRegex s
e@(Zero s
_) = GenRegex s
e
mkObr Label s
l s
s Int
n GenRegex s
Unit = forall s. SubexResults s -> GenRegex s -> GenRegex s
mkCbr [(Label s
l, forall a. StringLike a => Int -> a -> a
takeS Int
n s
s)] forall s. GenRegex s
mkUnit
mkObr Label s
l s
s Int
n GenRegex s
e = forall s. Label s -> s -> Int -> GenRegex s -> GenRegex s
Obr Label s
l s
s Int
n GenRegex s
e
mkCbr :: SubexResults s -> GenRegex s -> GenRegex s
mkCbr :: forall s. SubexResults s -> GenRegex s -> GenRegex s
mkCbr SubexResults s
_ e :: GenRegex s
e@(Zero s
_) = GenRegex s
e
mkCbr SubexResults s
ss (Cbr SubexResults s
ss1 GenRegex s
e) = forall s. SubexResults s -> GenRegex s -> GenRegex s
mkCbr (SubexResults s
ss forall a. Semigroup a => a -> a -> a
<> SubexResults s
ss1) GenRegex s
e
mkCbr SubexResults s
ss GenRegex s
e = forall s. SubexResults s -> GenRegex s -> GenRegex s
Cbr SubexResults s
ss GenRegex s
e
instance (StringLike s) => Show (GenRegex s) where
show :: GenRegex s -> String
show (Zero s
e) = String
"{" forall a. [a] -> [a] -> [a]
++ forall a. StringLike a => a -> String
toString s
e forall a. [a] -> [a] -> [a]
++ String
"}"
show GenRegex s
Unit = String
"()"
show (Sym CharSet
p)
| CharSet
p forall a. Eq a => a -> a -> Bool
== CharSet -> CharSet
compCS (String -> CharSet
stringCS String
"\n\r")
= String
"."
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null (forall a. [a] -> [a]
tail CharSet
cs) Bool -> Bool -> Bool
&&
forall {a}. Eq a => (a, a) -> Bool
rng1 (forall a. [a] -> a
head CharSet
cs)
= (Char, Char) -> String
escRng forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> a
head forall a b. (a -> b) -> a -> b
$ CharSet
cs
| Bool
otherwise = String
"[" forall a. [a] -> [a] -> [a]
++ forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
cs' forall a. [a] -> [a] -> [a]
++ String
"]"
where
rng1 :: (a, a) -> Bool
rng1 (a
x,a
y) = a
x forall a. Eq a => a -> a -> Bool
== a
y
cs :: CharSet
cs = CharSet
p
cs' :: [String]
cs' = forall a b. (a -> b) -> [a] -> [b]
map (Char, Char) -> String
escRng CharSet
p
escRng :: (Char, Char) -> String
escRng (Char
x, Char
y)
| Char
x forall a. Eq a => a -> a -> Bool
== Char
y = Char -> String
esc Char
x
| forall a. Enum a => a -> a
succ Char
x forall a. Eq a => a -> a -> Bool
== Char
y
= Char -> String
esc Char
x forall a. [a] -> [a] -> [a]
++ Char -> String
esc Char
y
| Bool
otherwise
= Char -> String
esc Char
x forall a. [a] -> [a] -> [a]
++ String
"-" forall a. [a] -> [a] -> [a]
++ Char -> String
esc Char
y
esc :: Char -> String
esc Char
x
| Char
x forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` String
"\\-[]{}()*+?.^"
= Char
'\\'forall a. a -> [a] -> [a]
:Char
xforall a. a -> [a] -> [a]
:String
""
| Char
x forall a. Ord a => a -> a -> Bool
>= Char
' ' Bool -> Bool -> Bool
&& Char
x forall a. Ord a => a -> a -> Bool
<= Char
'~'
= Char
xforall a. a -> [a] -> [a]
:String
""
| Bool
otherwise
= String
"&#" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (forall a. Enum a => a -> Int
fromEnum Char
x) forall a. [a] -> [a] -> [a]
++ String
";"
show GenRegex s
Dot = String
"\\a"
show (Star GenRegex s
Dot) = String
"\\A"
show (Star GenRegex s
e) = String
"(" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show GenRegex s
e forall a. [a] -> [a] -> [a]
++ String
"*)"
show (Alt GenRegex s
e1 GenRegex s
e2) = String
"(" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show GenRegex s
e1 forall a. [a] -> [a] -> [a]
++ String
"|" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show GenRegex s
e2 forall a. [a] -> [a] -> [a]
++ String
")"
show (Else GenRegex s
e1 GenRegex s
e2) = String
"(" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show GenRegex s
e1 forall a. [a] -> [a] -> [a]
++ String
"{|}" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show GenRegex s
e2 forall a. [a] -> [a] -> [a]
++ String
")"
show (Seq GenRegex s
e1 GenRegex s
e2) = String
"(" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show GenRegex s
e1 forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show GenRegex s
e2 forall a. [a] -> [a] -> [a]
++ String
")"
show (Rep Int
1 GenRegex s
e) = String
"(" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show GenRegex s
e forall a. [a] -> [a] -> [a]
++ String
"+)"
show (Rep Int
i GenRegex s
e) = String
"(" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show GenRegex s
e forall a. [a] -> [a] -> [a]
++ String
"{" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
i forall a. [a] -> [a] -> [a]
++ String
",})"
show (Rng Int
0 Int
1 GenRegex s
e) = String
"(" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show GenRegex s
e forall a. [a] -> [a] -> [a]
++ String
"?)"
show (Rng Int
i Int
j GenRegex s
e) = String
"(" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show GenRegex s
e forall a. [a] -> [a] -> [a]
++ String
"{" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
i forall a. [a] -> [a] -> [a]
++ String
"," forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
j forall a. [a] -> [a] -> [a]
++ String
"})"
show (Diff GenRegex s
e1 GenRegex s
e2) = String
"(" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show GenRegex s
e1 forall a. [a] -> [a] -> [a]
++ String
"{\\}" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show GenRegex s
e2 forall a. [a] -> [a] -> [a]
++ String
")"
show (Isec GenRegex s
e1 GenRegex s
e2) = String
"(" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show GenRegex s
e1 forall a. [a] -> [a] -> [a]
++ String
"{&}" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show GenRegex s
e2 forall a. [a] -> [a] -> [a]
++ String
")"
show (Exor GenRegex s
e1 GenRegex s
e2) = String
"(" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show GenRegex s
e1 forall a. [a] -> [a] -> [a]
++ String
"{^}" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show GenRegex s
e2 forall a. [a] -> [a] -> [a]
++ String
")"
show (Intl GenRegex s
e1 GenRegex s
e2) = String
"(" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show GenRegex s
e1 forall a. [a] -> [a] -> [a]
++ String
"{:}" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show GenRegex s
e2 forall a. [a] -> [a] -> [a]
++ String
")"
show (Br Label s
l GenRegex s
e) = String
"({" forall a. [a] -> [a] -> [a]
++ forall s. Show s => Label s -> String
showL Label s
l forall a. [a] -> [a] -> [a]
++ String
"}" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show GenRegex s
e forall a. [a] -> [a] -> [a]
++ String
")"
show (Obr Label s
l s
s Int
n GenRegex s
e) = String
"({" forall a. [a] -> [a] -> [a]
++ forall s. Show s => Label s -> String
showL Label s
l forall a. [a] -> [a] -> [a]
++ String
"=" forall a. [a] -> [a] -> [a]
++ forall a. StringLike a => a -> String
toString (forall a. StringLike a => Int -> a -> a
takeS Int
n s
s) forall a. [a] -> [a] -> [a]
++ String
"}" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show GenRegex s
e forall a. [a] -> [a] -> [a]
++ String
")"
show (Cbr [(Label s, s)]
ss GenRegex s
e) = String
"([" forall a. [a] -> [a] -> [a]
++ forall a. [a] -> [[a]] -> [a]
intercalate String
"," (forall a b. (a -> b) -> [a] -> [b]
map (\ (Label s
l, s
s) -> forall s. Show s => Label s -> String
showL Label s
l forall a. [a] -> [a] -> [a]
++ String
"=" forall a. [a] -> [a] -> [a]
++ (forall a. Show a => a -> String
show forall a b. (a -> b) -> a -> b
$ forall a. StringLike a => a -> String
toString s
s)) [(Label s, s)]
ss) forall a. [a] -> [a] -> [a]
++ String
"]"
forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show GenRegex s
e forall a. [a] -> [a] -> [a]
++
String
")"
showL :: Show s => Label s -> String
showL :: forall s. Show s => Label s -> String
showL = ShowS
rmq forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall b a. b -> (a -> b) -> Maybe a -> b
maybe String
"" forall a. Show a => a -> String
show
where
rmq :: ShowS
rmq (Char
'\"':String
xs) = forall a. [a] -> [a]
init String
xs
rmq String
xs = String
xs
isZero :: GenRegex s -> Bool
isZero :: forall s. GenRegex s -> Bool
isZero (Zero s
_) = Bool
True
isZero GenRegex s
_ = Bool
False
{-# INLINE isZero #-}
errRegex :: (StringLike s) =>
GenRegex s -> s
errRegex :: forall s. StringLike s => GenRegex s -> s
errRegex (Zero s
e) = s
e
errRegex GenRegex s
_ = forall a. StringLike a => a
emptyS
nullable :: (StringLike s) =>
GenRegex s -> Bool
nullable :: forall s. StringLike s => GenRegex s -> Bool
nullable = forall a b. (a, b) -> a
fst forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s. StringLike s => GenRegex s -> Nullable s
nullable'
{-# INLINE nullable #-}
nullable' :: (StringLike s) =>
GenRegex s -> Nullable s
nullable' :: forall s. StringLike s => GenRegex s -> Nullable s
nullable' (Zero s
_) = (Bool
False, [])
nullable' GenRegex s
Unit = (Bool
True, [])
nullable' GenRegex s
Dot = (Bool
False, [])
nullable' (Sym CharSet
_x) = (Bool
False, [])
nullable' (Star GenRegex s
_e) = (Bool
True, [])
nullable' (Rep Int
_i GenRegex s
e) = forall s. StringLike s => GenRegex s -> Nullable s
nullable' GenRegex s
e
nullable' (Rng Int
i Int
_ GenRegex s
e) = (Int
i forall a. Eq a => a -> a -> Bool
== Int
0, []) forall s. Nullable s -> Nullable s -> Nullable s
`unionN` forall s. StringLike s => GenRegex s -> Nullable s
nullable' GenRegex s
e
nullable' (Seq GenRegex s
e1 GenRegex s
e2) = forall s. StringLike s => GenRegex s -> Nullable s
nullable' GenRegex s
e1 forall s. Nullable s -> Nullable s -> Nullable s
`isectN` forall s. StringLike s => GenRegex s -> Nullable s
nullable' GenRegex s
e2
nullable' (Alt GenRegex s
e1 GenRegex s
e2) = forall s. StringLike s => GenRegex s -> Nullable s
nullable' GenRegex s
e1 forall s. Nullable s -> Nullable s -> Nullable s
`unionN` forall s. StringLike s => GenRegex s -> Nullable s
nullable' GenRegex s
e2
nullable' (Else GenRegex s
e1 GenRegex s
e2) = forall s. StringLike s => GenRegex s -> Nullable s
nullable' GenRegex s
e1 forall s. Nullable s -> Nullable s -> Nullable s
`orElseN` forall s. StringLike s => GenRegex s -> Nullable s
nullable' GenRegex s
e2
nullable' (Isec GenRegex s
e1 GenRegex s
e2) = forall s. StringLike s => GenRegex s -> Nullable s
nullable' GenRegex s
e1 forall s. Nullable s -> Nullable s -> Nullable s
`isectN` forall s. StringLike s => GenRegex s -> Nullable s
nullable' GenRegex s
e2
nullable' (Diff GenRegex s
e1 GenRegex s
e2) = forall s. StringLike s => GenRegex s -> Nullable s
nullable' GenRegex s
e1 forall s. Nullable s -> Nullable s -> Nullable s
`diffN` forall s. StringLike s => GenRegex s -> Nullable s
nullable' GenRegex s
e2
nullable' (Exor GenRegex s
e1 GenRegex s
e2) = forall s. StringLike s => GenRegex s -> Nullable s
nullable' GenRegex s
e1 forall s. Nullable s -> Nullable s -> Nullable s
`exorN` forall s. StringLike s => GenRegex s -> Nullable s
nullable' GenRegex s
e2
nullable' (Intl GenRegex s
e1 GenRegex s
e2) = forall s. StringLike s => GenRegex s -> Nullable s
nullable' GenRegex s
e1 forall s. Nullable s -> Nullable s -> Nullable s
`isectN` forall s. StringLike s => GenRegex s -> Nullable s
nullable' GenRegex s
e2
nullable' (Br Label s
l GenRegex s
e) = (Bool
True, [(Label s
l, forall a. StringLike a => a
emptyS )]) forall s. Nullable s -> Nullable s -> Nullable s
`isectN` forall s. StringLike s => GenRegex s -> Nullable s
nullable' GenRegex s
e
nullable' (Obr Label s
l s
s Int
n GenRegex s
e) = (Bool
True, [(Label s
l, forall a. StringLike a => Int -> a -> a
takeS Int
n s
s)]) forall s. Nullable s -> Nullable s -> Nullable s
`isectN` forall s. StringLike s => GenRegex s -> Nullable s
nullable' GenRegex s
e
nullable' (Cbr [(Label s, s)]
ss GenRegex s
e) = (Bool
True, [(Label s, s)]
ss) forall s. Nullable s -> Nullable s -> Nullable s
`isectN` forall s. StringLike s => GenRegex s -> Nullable s
nullable' GenRegex s
e
isectN :: Nullable s -> Nullable s -> Nullable s
isectN :: forall s. Nullable s -> Nullable s -> Nullable s
isectN (Bool
True, SubexResults s
ws1) (Bool
True, SubexResults s
ws2) = (Bool
True, SubexResults s
ws1 forall a. [a] -> [a] -> [a]
++ SubexResults s
ws2)
isectN (Bool, SubexResults s)
_ (Bool, SubexResults s)
_ = (Bool
False, [])
unionN :: Nullable s -> Nullable s -> Nullable s
unionN :: forall s. Nullable s -> Nullable s -> Nullable s
unionN (Bool
False, SubexResults s
_) (Bool
False, SubexResults s
_) = (Bool
False, [])
unionN (Bool
_, SubexResults s
ws1) (Bool
_, SubexResults s
ws2) = (Bool
True, SubexResults s
ws1 forall a. [a] -> [a] -> [a]
++ SubexResults s
ws2)
orElseN :: Nullable s -> Nullable s -> Nullable s
orElseN :: forall s. Nullable s -> Nullable s -> Nullable s
orElseN e1 :: Nullable s
e1@(Bool
True, SubexResults s
_ws1) Nullable s
_ = Nullable s
e1
orElseN Nullable s
_ Nullable s
e2 = Nullable s
e2
diffN :: Nullable s -> Nullable s -> Nullable s
diffN :: forall s. Nullable s -> Nullable s -> Nullable s
diffN Nullable s
n1 (Bool
False, SubexResults s
_) = Nullable s
n1
diffN Nullable s
_ Nullable s
_ = (Bool
False, [])
exorN :: Nullable s -> Nullable s -> Nullable s
exorN :: forall s. Nullable s -> Nullable s -> Nullable s
exorN n1 :: Nullable s
n1@(Bool
True, SubexResults s
_) (Bool
False, SubexResults s
_) = Nullable s
n1
exorN (Bool
False, SubexResults s
_) n2 :: Nullable s
n2@(Bool
True, SubexResults s
_) = Nullable s
n2
exorN Nullable s
_ Nullable s
_ = (Bool
False, [])
firstChars :: (StringLike s) =>
GenRegex s -> CharSet
firstChars :: forall s. StringLike s => GenRegex s -> CharSet
firstChars (Zero s
_) = CharSet
emptyCS
firstChars GenRegex s
Unit = CharSet
emptyCS
firstChars (Sym CharSet
p) = CharSet
p
firstChars GenRegex s
Dot = CharSet
allCS
firstChars (Star GenRegex s
e1) = forall s. StringLike s => GenRegex s -> CharSet
firstChars GenRegex s
e1
firstChars (Alt GenRegex s
e1 GenRegex s
e2) = forall s. StringLike s => GenRegex s -> CharSet
firstChars GenRegex s
e1 CharSet -> CharSet -> CharSet
`unionCS` forall s. StringLike s => GenRegex s -> CharSet
firstChars GenRegex s
e2
firstChars (Else GenRegex s
e1 GenRegex s
e2) = forall s. StringLike s => GenRegex s -> CharSet
firstChars GenRegex s
e1 CharSet -> CharSet -> CharSet
`unionCS` forall s. StringLike s => GenRegex s -> CharSet
firstChars GenRegex s
e2
firstChars (Seq GenRegex s
e1 GenRegex s
e2)
| forall s. StringLike s => GenRegex s -> Bool
nullable GenRegex s
e1 = forall s. StringLike s => GenRegex s -> CharSet
firstChars GenRegex s
e1 CharSet -> CharSet -> CharSet
`unionCS` forall s. StringLike s => GenRegex s -> CharSet
firstChars GenRegex s
e2
| Bool
otherwise = forall s. StringLike s => GenRegex s -> CharSet
firstChars GenRegex s
e1
firstChars (Rep Int
_i GenRegex s
e) = forall s. StringLike s => GenRegex s -> CharSet
firstChars GenRegex s
e
firstChars (Rng Int
_i Int
_j GenRegex s
e) = forall s. StringLike s => GenRegex s -> CharSet
firstChars GenRegex s
e
firstChars (Diff GenRegex s
e1 GenRegex s
_e2) = forall s. StringLike s => GenRegex s -> CharSet
firstChars GenRegex s
e1
firstChars (Isec GenRegex s
e1 GenRegex s
e2) = forall s. StringLike s => GenRegex s -> CharSet
firstChars GenRegex s
e1 CharSet -> CharSet -> CharSet
`intersectCS` forall s. StringLike s => GenRegex s -> CharSet
firstChars GenRegex s
e2
firstChars (Exor GenRegex s
e1 GenRegex s
e2) = forall s. StringLike s => GenRegex s -> CharSet
firstChars GenRegex s
e1 CharSet -> CharSet -> CharSet
`unionCS` forall s. StringLike s => GenRegex s -> CharSet
firstChars GenRegex s
e2
firstChars (Intl GenRegex s
e1 GenRegex s
e2) = forall s. StringLike s => GenRegex s -> CharSet
firstChars GenRegex s
e1 CharSet -> CharSet -> CharSet
`unionCS` forall s. StringLike s => GenRegex s -> CharSet
firstChars GenRegex s
e2
firstChars (Br Label s
_l GenRegex s
e) = forall s. StringLike s => GenRegex s -> CharSet
firstChars GenRegex s
e
firstChars (Obr Label s
_l s
_s Int
_n GenRegex s
e) = forall s. StringLike s => GenRegex s -> CharSet
firstChars GenRegex s
e
firstChars (Cbr [(Label s, s)]
_ss GenRegex s
e) = forall s. StringLike s => GenRegex s -> CharSet
firstChars GenRegex s
e
delta1 :: (StringLike s) => Char -> s -> GenRegex s -> GenRegex s
delta1 :: forall s. StringLike s => Char -> s -> GenRegex s -> GenRegex s
delta1 Char
c s
inp GenRegex s
e0
= GenRegex s -> GenRegex s
d' GenRegex s
e0
where
d' :: GenRegex s -> GenRegex s
d' e :: GenRegex s
e@(Zero s
_) = GenRegex s
e
d' GenRegex s
Unit = forall s. StringLike s => String -> GenRegex s
mkZero' forall a b. (a -> b) -> a -> b
$
String
"unexpected char " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Char
c
d' (Sym CharSet
p)
| Char
c Char -> CharSet -> Bool
`elemCS` CharSet
p = forall s. GenRegex s
mkUnit
| Bool
otherwise = forall s. StringLike s => String -> GenRegex s
mkZero' forall a b. (a -> b) -> a -> b
$
String
"unexpected char " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Char
c
d' GenRegex s
Dot = forall s. GenRegex s
mkUnit
d' e :: GenRegex s
e@(Star GenRegex s
Dot) = GenRegex s
e
d' e :: GenRegex s
e@(Star GenRegex s
e1) = forall s. GenRegex s -> GenRegex s -> GenRegex s
mkSeq (GenRegex s -> GenRegex s
d' GenRegex s
e1) GenRegex s
e
d' (Alt GenRegex s
e1 GenRegex s
e2) = forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkAlt (GenRegex s -> GenRegex s
d' GenRegex s
e1) (GenRegex s -> GenRegex s
d' GenRegex s
e2)
d' (Else GenRegex s
e1 GenRegex s
e2) = forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkElse (GenRegex s -> GenRegex s
d' GenRegex s
e1) (GenRegex s -> GenRegex s
d' GenRegex s
e2)
d' (Seq e1 :: GenRegex s
e1@(Br Label s
l GenRegex s
e1') GenRegex s
e2)
| forall s. StringLike s => GenRegex s -> Bool
nullable GenRegex s
e1' = forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkAlt (forall s. GenRegex s -> GenRegex s -> GenRegex s
mkSeq (GenRegex s -> GenRegex s
d' GenRegex s
e1) GenRegex s
e2)
(forall s. SubexResults s -> GenRegex s -> GenRegex s
mkCbr [(Label s
l, forall a. StringLike a => a
emptyS)] (GenRegex s -> GenRegex s
d' GenRegex s
e2))
d' (Seq e1 :: GenRegex s
e1@(Obr Label s
l s
s Int
n GenRegex s
e1') GenRegex s
e2)
| Bool
nu = forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkAlt (forall s. GenRegex s -> GenRegex s -> GenRegex s
mkSeq (GenRegex s -> GenRegex s
d' GenRegex s
e1) GenRegex s
e2)
(forall s. SubexResults s -> GenRegex s -> GenRegex s
mkCbr ((Label s
l, forall a. StringLike a => Int -> a -> a
takeS Int
n s
s) forall a. a -> [a] -> [a]
: [(Label s, s)]
ws) (GenRegex s -> GenRegex s
d' GenRegex s
e2))
where
(Bool
nu, [(Label s, s)]
ws) = forall s. StringLike s => GenRegex s -> Nullable s
nullable' GenRegex s
e1'
d' (Seq GenRegex s
e1 GenRegex s
e2)
| forall s. StringLike s => GenRegex s -> Bool
nullable GenRegex s
e1 = forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkAlt (forall s. GenRegex s -> GenRegex s -> GenRegex s
mkSeq (GenRegex s -> GenRegex s
d' GenRegex s
e1) GenRegex s
e2)
(GenRegex s -> GenRegex s
d' GenRegex s
e2)
| Bool
otherwise = forall s. GenRegex s -> GenRegex s -> GenRegex s
mkSeq (GenRegex s -> GenRegex s
d' GenRegex s
e1) GenRegex s
e2
d' (Rep Int
i GenRegex s
e) = forall s. GenRegex s -> GenRegex s -> GenRegex s
mkSeq (GenRegex s -> GenRegex s
d' GenRegex s
e) (forall s. StringLike s => Int -> GenRegex s -> GenRegex s
mkRep (Int
iforall a. Num a => a -> a -> a
-Int
1) GenRegex s
e)
d' (Rng Int
i Int
j GenRegex s
e) = forall s. GenRegex s -> GenRegex s -> GenRegex s
mkSeq (GenRegex s -> GenRegex s
d' GenRegex s
e) (forall s. StringLike s => Int -> Int -> GenRegex s -> GenRegex s
mkRng ((Int
iforall a. Num a => a -> a -> a
-Int
1) forall a. Ord a => a -> a -> a
`max` Int
0) (Int
jforall a. Num a => a -> a -> a
-Int
1) GenRegex s
e)
d' (Diff GenRegex s
e1 GenRegex s
e2) = forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkDiff (GenRegex s -> GenRegex s
d' GenRegex s
e1) (GenRegex s -> GenRegex s
d' GenRegex s
e2)
d' (Isec GenRegex s
e1 GenRegex s
e2) = forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkIsect (GenRegex s -> GenRegex s
d' GenRegex s
e1) (GenRegex s -> GenRegex s
d' GenRegex s
e2)
d' (Exor GenRegex s
e1 GenRegex s
e2) = forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkExor (GenRegex s -> GenRegex s
d' GenRegex s
e1) (GenRegex s -> GenRegex s
d' GenRegex s
e2)
d' (Intl GenRegex s
e1 GenRegex s
e2) = forall s. StringLike s => GenRegex s -> GenRegex s -> GenRegex s
mkAlt (forall s. GenRegex s -> GenRegex s -> GenRegex s
mkInterleave (GenRegex s -> GenRegex s
d' GenRegex s
e1) GenRegex s
e2 )
(forall s. GenRegex s -> GenRegex s -> GenRegex s
mkInterleave GenRegex s
e1 (GenRegex s -> GenRegex s
d' GenRegex s
e2))
d' (Br Label s
l GenRegex s
e) = GenRegex s -> GenRegex s
d' (forall s.
StringLike s =>
Label s -> s -> Int -> GenRegex s -> GenRegex s
mkObr Label s
l s
inp Int
0 GenRegex s
e)
d' (Obr Label s
l s
s Int
n GenRegex s
e) = forall s.
StringLike s =>
Label s -> s -> Int -> GenRegex s -> GenRegex s
mkObr Label s
l s
s (Int
n forall a. Num a => a -> a -> a
+ Int
1) (GenRegex s -> GenRegex s
d' GenRegex s
e)
d' (Cbr [(Label s, s)]
ss GenRegex s
e) = forall s. SubexResults s -> GenRegex s -> GenRegex s
mkCbr [(Label s, s)]
ss (GenRegex s -> GenRegex s
d' GenRegex s
e)
delta :: (StringLike s) => s -> GenRegex s -> GenRegex s
delta :: forall s. StringLike s => s -> GenRegex s -> GenRegex s
delta inp :: s
inp@(forall a. StringLike a => a -> Maybe (Char, a)
uncons -> Just (Char
c, s
inp')) GenRegex s
e0
= GenRegex s -> GenRegex s
d' GenRegex s
e0
where
d' :: GenRegex s -> GenRegex s
d' e :: GenRegex s
e@(Zero s
_) = GenRegex s
e
d' e :: GenRegex s
e@(Star GenRegex s
Dot) = GenRegex s
e
d' GenRegex s
e = forall s. StringLike s => s -> GenRegex s -> GenRegex s
delta s
inp' (
forall s. StringLike s => Char -> s -> GenRegex s -> GenRegex s
delta1 Char
c s
inp GenRegex s
e)
delta s
_empty GenRegex s
e
= GenRegex s
e
matchWithRegex :: (StringLike s) =>
GenRegex s -> s -> Bool
matchWithRegex :: forall s. StringLike s => GenRegex s -> s -> Bool
matchWithRegex GenRegex s
e s
s
= forall s. StringLike s => GenRegex s -> Bool
nullable forall a b. (a -> b) -> a -> b
$ forall s. StringLike s => s -> GenRegex s -> GenRegex s
delta s
s GenRegex s
e
matchWithRegex' :: (StringLike s) =>
GenRegex s -> s -> Maybe (SubexResults s)
matchWithRegex' :: forall s. StringLike s => GenRegex s -> s -> Maybe (SubexResults s)
matchWithRegex' GenRegex s
e s
s
= (\ (Bool
r, SubexResults s
l) -> if Bool
r then forall a. a -> Maybe a
Just SubexResults s
l else forall a. Maybe a
Nothing) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s. StringLike s => GenRegex s -> Nullable s
nullable' forall a b. (a -> b) -> a -> b
$ forall s. StringLike s => s -> GenRegex s -> GenRegex s
delta s
s GenRegex s
e
splitWithRegex :: (StringLike s) =>
GenRegex s -> s -> Maybe (SubexResults s, s)
splitWithRegex :: forall s.
StringLike s =>
GenRegex s -> s -> Maybe (SubexResults s, s)
splitWithRegex GenRegex s
re s
inp
= do
(GenRegex s
re', s
rest) <- forall s. StringLike s => GenRegex s -> s -> Maybe (GenRegex s, s)
splitWithRegex' (forall s. GenRegex s -> GenRegex s
mkBrN GenRegex s
re) s
inp
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 s. StringLike s => GenRegex s -> Nullable s
nullable' forall a b. (a -> b) -> a -> b
$ GenRegex s
re', s
rest)
splitWithRegexCS :: (StringLike s) =>
GenRegex s -> CharSet -> s -> Maybe (SubexResults s, s)
splitWithRegexCS :: forall s.
StringLike s =>
GenRegex s -> CharSet -> s -> Maybe (SubexResults s, s)
splitWithRegexCS GenRegex s
re CharSet
cs s
inp
= do
(GenRegex s
re', s
rest) <- forall s.
StringLike s =>
GenRegex s -> CharSet -> s -> Maybe (GenRegex s, s)
splitWithRegexCS' (forall s. GenRegex s -> GenRegex s
mkBrN GenRegex s
re) CharSet
cs s
inp
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 s. StringLike s => GenRegex s -> Nullable s
nullable' forall a b. (a -> b) -> a -> b
$ GenRegex s
re', s
rest)
splitWithRegex' :: (StringLike s) =>
GenRegex s -> s -> Maybe (GenRegex s, s)
splitWithRegex' :: forall s. StringLike s => GenRegex s -> s -> Maybe (GenRegex s, s)
splitWithRegex' GenRegex s
re s
inp
= forall s.
StringLike s =>
Maybe (GenRegex s, s) -> GenRegex s -> s -> Maybe (GenRegex s, s)
splitWithRegex''
( if forall s. StringLike s => GenRegex s -> Bool
nullable GenRegex s
re
then forall a. a -> Maybe a
Just (GenRegex s
re, s
inp)
else forall a. Maybe a
Nothing
) GenRegex s
re s
inp
splitWithRegex'' :: (StringLike s) =>
Maybe (GenRegex s, s) -> GenRegex s -> s -> Maybe (GenRegex s, s)
splitWithRegex'' :: forall s.
StringLike s =>
Maybe (GenRegex s, s) -> GenRegex s -> s -> Maybe (GenRegex s, s)
splitWithRegex'' Maybe (GenRegex s, s)
lastRes GenRegex s
re inp :: s
inp@(forall a. StringLike a => a -> Maybe (Char, a)
uncons -> Just (Char
c, s
inp'))
| forall s. GenRegex s -> Bool
isZero GenRegex s
re = Maybe (GenRegex s, s)
lastRes
| Bool
otherwise = forall s.
StringLike s =>
Maybe (GenRegex s, s) -> GenRegex s -> s -> Maybe (GenRegex s, s)
splitWithRegex'' Maybe (GenRegex s, s)
nextRes GenRegex s
re' forall a b. (a -> b) -> a -> b
$ s
inp'
where
re' :: GenRegex s
re' = forall s. StringLike s => Char -> s -> GenRegex s -> GenRegex s
delta1 Char
c s
inp GenRegex s
re
nextRes :: Maybe (GenRegex s, s)
nextRes
| forall s. StringLike s => GenRegex s -> Bool
nullable GenRegex s
re' = forall a. a -> Maybe a
Just (GenRegex s
re', s
inp')
| Bool
otherwise = Maybe (GenRegex s, s)
lastRes
splitWithRegex'' Maybe (GenRegex s, s)
lastRes GenRegex s
_re s
_empty
= Maybe (GenRegex s, s)
lastRes
splitWithRegexCS' :: (StringLike s) =>
GenRegex s -> CharSet -> s -> Maybe (GenRegex s, s)
splitWithRegexCS' :: forall s.
StringLike s =>
GenRegex s -> CharSet -> s -> Maybe (GenRegex s, s)
splitWithRegexCS' GenRegex s
re CharSet
cs inp :: s
inp@(forall a. StringLike a => a -> Maybe (Char, a)
uncons -> Just (Char
c, s
_inp'))
| Char
c Char -> CharSet -> Bool
`elemCS` CharSet
cs = forall s. StringLike s => GenRegex s -> s -> Maybe (GenRegex s, s)
splitWithRegex' GenRegex s
re s
inp
splitWithRegexCS' GenRegex s
re CharSet
_cs s
inp
| forall s. StringLike s => GenRegex s -> Bool
nullable GenRegex s
re = forall a. a -> Maybe a
Just (GenRegex s
re, s
inp)
| Bool
otherwise = forall a. Maybe a
Nothing