{-# LANGUAGE CPP #-}
{-# LANGUAGE OverloadedStrings #-}
module Regex.KDE.Regex
( Direction(..)
, Regex(..)
, isWordChar
) where
import Data.Char
#if !MIN_VERSION_base(4,11,0)
import Data.Semigroup ((<>), Semigroup)
#endif
data Direction = Forward | Backward
deriving (Int -> Direction -> ShowS
[Direction] -> ShowS
Direction -> String
(Int -> Direction -> ShowS)
-> (Direction -> String)
-> ([Direction] -> ShowS)
-> Show Direction
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Direction -> ShowS
showsPrec :: Int -> Direction -> ShowS
$cshow :: Direction -> String
show :: Direction -> String
$cshowList :: [Direction] -> ShowS
showList :: [Direction] -> ShowS
Show, Direction -> Direction -> Bool
(Direction -> Direction -> Bool)
-> (Direction -> Direction -> Bool) -> Eq Direction
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Direction -> Direction -> Bool
== :: Direction -> Direction -> Bool
$c/= :: Direction -> Direction -> Bool
/= :: Direction -> Direction -> Bool
Eq)
data Regex =
MatchAnyChar |
MatchDynamic !Int |
MatchChar (Char -> Bool) |
MatchSome !Regex |
MatchAlt !Regex !Regex |
MatchConcat !Regex !Regex |
MatchCapture !Int !Regex |
MatchCaptured !Int !Bool |
AssertWordBoundary |
AssertBeginning |
AssertEnd |
AssertPositive !Direction !Regex |
AssertNegative !Direction !Regex |
Possessive !Regex |
Lazy !Regex |
Subroutine !Int |
MatchNull
instance Show Regex where
show :: Regex -> String
show Regex
MatchAnyChar = String
"MatchAnyChar"
show (MatchDynamic Int
i) = String
"MatchDynamic " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
i
show (MatchChar Char -> Bool
_) = String
"(MatchChar <fn>)"
show (MatchSome Regex
re) = String
"(MatchSome " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Regex -> String
forall a. Show a => a -> String
show Regex
re String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
")"
show (MatchAlt Regex
r1 Regex
r2) = String
"(MatchAlt " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Regex -> String
forall a. Show a => a -> String
show Regex
r1 String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
" " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Regex -> String
forall a. Show a => a -> String
show Regex
r2 String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
")"
show (MatchConcat Regex
r1 Regex
r2) = String
"(MatchConcat " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Regex -> String
forall a. Show a => a -> String
show Regex
r1 String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
" " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Regex -> String
forall a. Show a => a -> String
show Regex
r2 String -> ShowS
forall a. Semigroup a => a -> a -> a
<>
String
")"
show (MatchCapture Int
i Regex
re) = String
"(MatchCapture " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
i String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
" " String -> ShowS
forall a. Semigroup a => a -> a -> a
<>
Regex -> String
forall a. Show a => a -> String
show Regex
re String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
")"
show (MatchCaptured Int
n Bool
cs) = String
"(MatchCaptured " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
n String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
" " String -> ShowS
forall a. Semigroup a => a -> a -> a
<>
Bool -> String
forall a. Show a => a -> String
show Bool
cs String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
")"
show Regex
AssertWordBoundary = String
"AssertWordBoundary"
show Regex
AssertBeginning = String
"AssertBeginning"
show Regex
AssertEnd = String
"AssertEnd"
show (AssertPositive Direction
dir Regex
re) = String
"(AssertPositive " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Direction -> String
forall a. Show a => a -> String
show Direction
dir String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
" " String -> ShowS
forall a. Semigroup a => a -> a -> a
<>
Regex -> String
forall a. Show a => a -> String
show Regex
re String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
")"
show (AssertNegative Direction
dir Regex
re) = String
"(AssertNegativeLookahead " String -> ShowS
forall a. Semigroup a => a -> a -> a
<>
Direction -> String
forall a. Show a => a -> String
show Direction
dir String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
" " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Regex -> String
forall a. Show a => a -> String
show Regex
re String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
")"
show (Possessive Regex
re) = String
"(Possessive " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Regex -> String
forall a. Show a => a -> String
show Regex
re String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
")"
show (Lazy Regex
re) = String
"(Lazy " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Regex -> String
forall a. Show a => a -> String
show Regex
re String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
")"
show (Subroutine Int
i) = String
"(Subroutine " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
i String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
")"
show Regex
MatchNull = String
"MatchNull"
instance Semigroup Regex where
<> :: Regex -> Regex -> Regex
(<>) = Regex -> Regex -> Regex
MatchConcat
instance Monoid Regex where
mempty :: Regex
mempty = Regex
MatchNull
mappend :: Regex -> Regex -> Regex
mappend = Regex -> Regex -> Regex
forall a. Semigroup a => a -> a -> a
(<>)
isWordChar :: Char -> Bool
isWordChar :: Char -> Bool
isWordChar Char
c = Char -> Bool
isAlphaNum Char
c Bool -> Bool -> Bool
|| Char -> GeneralCategory
generalCategory Char
c GeneralCategory -> GeneralCategory -> Bool
forall a. Eq a => a -> a -> Bool
== GeneralCategory
ConnectorPunctuation