{-# LANGUAGE CPP #-}
#if __GLASGOW_HASKELL__ >=704
{-# LANGUAGE Safe #-}
#endif
module Text.Regex.Applicative.Text
(
RE'
, R.RE
, sym
, psym
, msym
, anySym
, string
, reFoldl
, R.Greediness(..)
, few
, withMatched
, match
, (=~)
, replace
, findFirstPrefix
, findLongestPrefix
, findShortestPrefix
, findFirstInfix
, findLongestInfix
, findShortestInfix
, module Control.Applicative
) where
import Control.Applicative
import Control.Arrow
import Data.Monoid (mappend)
import Data.Text (Text)
import qualified Data.Text as T
import qualified Text.Regex.Applicative as R
type RE' a = R.RE Char a
psym :: (Char -> Bool) -> RE' Char
psym :: (Char -> Bool) -> RE' Char
psym = (Char -> Bool) -> RE' Char
forall s. (s -> Bool) -> RE s s
R.psym
msym :: (Char -> Maybe a) -> RE' a
msym :: (Char -> Maybe a) -> RE' a
msym = (Char -> Maybe a) -> RE' a
forall s a. (s -> Maybe a) -> RE s a
R.msym
sym :: Char -> RE' Char
sym :: Char -> RE' Char
sym = Char -> RE' Char
forall s. Eq s => s -> RE s s
R.sym
anySym :: RE' Char
anySym :: RE' Char
anySym = RE' Char
forall s. RE s s
R.anySym
string :: Text -> RE' Text
string :: Text -> RE' Text
string = (String -> Text) -> RE Char String -> RE' Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap String -> Text
T.pack (RE Char String -> RE' Text)
-> (Text -> RE Char String) -> Text -> RE' Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> RE Char String
forall a. Eq a => [a] -> RE a [a]
R.string (String -> RE Char String)
-> (Text -> String) -> Text -> RE Char String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
T.unpack
reFoldl :: R.Greediness -> (b -> a -> b) -> b -> RE' a -> RE' b
reFoldl :: Greediness -> (b -> a -> b) -> b -> RE' a -> RE' b
reFoldl = Greediness -> (b -> a -> b) -> b -> RE' a -> RE' b
forall b a s. Greediness -> (b -> a -> b) -> b -> RE s a -> RE s b
R.reFoldl
few :: RE' a -> RE' [a]
few :: RE' a -> RE' [a]
few = RE' a -> RE' [a]
forall s a. RE s a -> RE s [a]
R.few
withMatched :: RE' a -> RE' (a, Text)
withMatched :: RE' a -> RE' (a, Text)
withMatched = ((a, String) -> (a, Text)) -> RE Char (a, String) -> RE' (a, Text)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((String -> Text) -> (a, String) -> (a, Text)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second String -> Text
T.pack) (RE Char (a, String) -> RE' (a, Text))
-> (RE' a -> RE Char (a, String)) -> RE' a -> RE' (a, Text)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RE' a -> RE Char (a, String)
forall s a. RE s a -> RE s (a, [s])
R.withMatched
(=~) :: Text -> RE' a -> Maybe a
=~ :: Text -> RE' a -> Maybe a
(=~) = (RE' a -> Text -> Maybe a) -> Text -> RE' a -> Maybe a
forall a b c. (a -> b -> c) -> b -> a -> c
flip RE' a -> Text -> Maybe a
forall a. RE' a -> Text -> Maybe a
match
infix 2 =~
match :: RE' a -> Text -> Maybe a
match :: RE' a -> Text -> Maybe a
match = (RE' a -> String -> Maybe a) -> RE' a -> Text -> Maybe a
forall a b. (a -> String -> b) -> a -> Text -> b
reTextF RE' a -> String -> Maybe a
forall s a. RE s a -> [s] -> Maybe a
R.match
findFirstPrefix :: RE' a -> Text -> Maybe (a, Text)
findFirstPrefix :: RE' a -> Text -> Maybe (a, Text)
findFirstPrefix = ((a, String) -> (a, Text)) -> Maybe (a, String) -> Maybe (a, Text)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, String) -> (a, Text)
forall a. (a, String) -> (a, Text)
pairF (Maybe (a, String) -> Maybe (a, Text))
-> (RE' a -> Text -> Maybe (a, String))
-> RE' a
-> Text
-> Maybe (a, Text)
forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
.: (RE' a -> String -> Maybe (a, String))
-> RE' a -> Text -> Maybe (a, String)
forall a b. (a -> String -> b) -> a -> Text -> b
reTextF RE' a -> String -> Maybe (a, String)
forall s a. RE s a -> [s] -> Maybe (a, [s])
R.findFirstPrefix
findLongestPrefix :: RE' a -> Text -> Maybe (a, Text)
findLongestPrefix :: RE' a -> Text -> Maybe (a, Text)
findLongestPrefix = ((a, String) -> (a, Text)) -> Maybe (a, String) -> Maybe (a, Text)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, String) -> (a, Text)
forall a. (a, String) -> (a, Text)
pairF (Maybe (a, String) -> Maybe (a, Text))
-> (RE' a -> Text -> Maybe (a, String))
-> RE' a
-> Text
-> Maybe (a, Text)
forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
.: (RE' a -> String -> Maybe (a, String))
-> RE' a -> Text -> Maybe (a, String)
forall a b. (a -> String -> b) -> a -> Text -> b
reTextF RE' a -> String -> Maybe (a, String)
forall s a. RE s a -> [s] -> Maybe (a, [s])
R.findLongestPrefix
findShortestPrefix :: RE' a -> Text -> Maybe (a, Text)
findShortestPrefix :: RE' a -> Text -> Maybe (a, Text)
findShortestPrefix = ((a, String) -> (a, Text)) -> Maybe (a, String) -> Maybe (a, Text)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, String) -> (a, Text)
forall a. (a, String) -> (a, Text)
pairF (Maybe (a, String) -> Maybe (a, Text))
-> (RE' a -> Text -> Maybe (a, String))
-> RE' a
-> Text
-> Maybe (a, Text)
forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
.: (RE' a -> String -> Maybe (a, String))
-> RE' a -> Text -> Maybe (a, String)
forall a b. (a -> String -> b) -> a -> Text -> b
reTextF RE' a -> String -> Maybe (a, String)
forall s a. RE s a -> [s] -> Maybe (a, [s])
R.findShortestPrefix
findFirstInfix :: RE' a -> Text -> Maybe (Text, a, Text)
findFirstInfix :: RE' a -> Text -> Maybe (Text, a, Text)
findFirstInfix = ((String, a, String) -> (Text, a, Text))
-> Maybe (String, a, String) -> Maybe (Text, a, Text)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (String, a, String) -> (Text, a, Text)
forall a. (String, a, String) -> (Text, a, Text)
tripleF (Maybe (String, a, String) -> Maybe (Text, a, Text))
-> (RE' a -> Text -> Maybe (String, a, String))
-> RE' a
-> Text
-> Maybe (Text, a, Text)
forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
.: (RE' a -> String -> Maybe (String, a, String))
-> RE' a -> Text -> Maybe (String, a, String)
forall a b. (a -> String -> b) -> a -> Text -> b
reTextF RE' a -> String -> Maybe (String, a, String)
forall s a. RE s a -> [s] -> Maybe ([s], a, [s])
R.findFirstInfix
findLongestInfix :: RE' a -> Text -> Maybe (Text, a, Text)
findLongestInfix :: RE' a -> Text -> Maybe (Text, a, Text)
findLongestInfix = ((String, a, String) -> (Text, a, Text))
-> Maybe (String, a, String) -> Maybe (Text, a, Text)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (String, a, String) -> (Text, a, Text)
forall a. (String, a, String) -> (Text, a, Text)
tripleF (Maybe (String, a, String) -> Maybe (Text, a, Text))
-> (RE' a -> Text -> Maybe (String, a, String))
-> RE' a
-> Text
-> Maybe (Text, a, Text)
forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
.: (RE' a -> String -> Maybe (String, a, String))
-> RE' a -> Text -> Maybe (String, a, String)
forall a b. (a -> String -> b) -> a -> Text -> b
reTextF RE' a -> String -> Maybe (String, a, String)
forall s a. RE s a -> [s] -> Maybe ([s], a, [s])
R.findLongestInfix
findShortestInfix :: RE' a -> Text -> Maybe (Text, a, Text)
findShortestInfix :: RE' a -> Text -> Maybe (Text, a, Text)
findShortestInfix = ((String, a, String) -> (Text, a, Text))
-> Maybe (String, a, String) -> Maybe (Text, a, Text)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (String, a, String) -> (Text, a, Text)
forall a. (String, a, String) -> (Text, a, Text)
tripleF (Maybe (String, a, String) -> Maybe (Text, a, Text))
-> (RE' a -> Text -> Maybe (String, a, String))
-> RE' a
-> Text
-> Maybe (Text, a, Text)
forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
.: (RE' a -> String -> Maybe (String, a, String))
-> RE' a -> Text -> Maybe (String, a, String)
forall a b. (a -> String -> b) -> a -> Text -> b
reTextF RE' a -> String -> Maybe (String, a, String)
forall s a. RE s a -> [s] -> Maybe ([s], a, [s])
R.findShortestInfix
replace :: RE' Text -> Text -> Text
replace :: RE' Text -> Text -> Text
replace RE' Text
r = String -> Text
go (String -> Text) -> (Text -> String) -> Text -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
T.unpack
where go :: String -> Text
go :: String -> Text
go [] = Text
T.empty
go ys :: String
ys@(Char
x:String
xs) = case RE' Text -> String -> Maybe (Text, String)
forall s a. RE s a -> [s] -> Maybe (a, [s])
R.findLongestPrefix RE' Text
r String
ys of
Maybe (Text, String)
Nothing -> Char -> Text -> Text
T.cons Char
x (String -> Text
go String
xs)
Just (Text
prefix, String
rest) -> Text
prefix Text -> Text -> Text
forall a. Monoid a => a -> a -> a
`mappend` String -> Text
go String
rest
reTextF :: (a -> String -> b) -> (a -> Text -> b)
reTextF :: (a -> String -> b) -> a -> Text -> b
reTextF a -> String -> b
f a
a Text
s = a -> String -> b
f a
a (Text -> String
T.unpack Text
s)
pairF :: (a, String) -> (a, Text)
pairF :: (a, String) -> (a, Text)
pairF (a
x, String
y) = (a
x, String -> Text
T.pack String
y)
{-# INLINE pairF #-}
tripleF :: (String, a, String) -> (Text, a, Text)
tripleF :: (String, a, String) -> (Text, a, Text)
tripleF (String
x, a
y, String
z) = (String -> Text
T.pack String
x, a
y, String -> Text
T.pack String
z)
{-# INLINE tripleF #-}
(.:) :: (c -> d) -> (a -> b -> c) -> (a -> b -> d)
c -> d
f .: :: (c -> d) -> (a -> b -> c) -> a -> b -> d
.: a -> b -> c
g = \a
a b
b -> c -> d
f (a -> b -> c
g a
a b
b)
{-# INLINE (.:) #-}