\begin{code}
{-# LANGUAGE RecordWildCards            #-}
{-# LANGUAGE FlexibleInstances          #-}
{-# LANGUAGE UndecidableInstances       #-}
{-# LANGUAGE MultiParamTypeClasses      #-}
{-# LANGUAGE DeriveDataTypeable         #-}
\end{code}

\begin{code}
module Text.RE.ZeInternals.Types.Capture
  ( Capture(..)
  , hasCaptured
  , capturePrefix
  , captureSuffix
  ) where
\end{code}

\begin{code}
import           Text.Regex.Base
\end{code}



\begin{code}
-- | the matching of a single sub-expression against part of the source
-- text
data Capture a =
  Capture
    { Capture a -> a
captureSource  :: !a    -- ^ the whole text that was searched
    , Capture a -> a
capturedText   :: !a    -- ^ the text that was matched
    , Capture a -> Int
captureOffset  :: !Int  -- ^ the number of characters preceding the
                              -- match with -1 used if no text was captured
                              -- by the RE (not even the empty string)
    , Capture a -> Int
captureLength  :: !Int  -- ^ the number of chacter in the captured
                              -- sub-string
    }
  deriving (Int -> Capture a -> ShowS
[Capture a] -> ShowS
Capture a -> String
(Int -> Capture a -> ShowS)
-> (Capture a -> String)
-> ([Capture a] -> ShowS)
-> Show (Capture a)
forall a. Show a => Int -> Capture a -> ShowS
forall a. Show a => [Capture a] -> ShowS
forall a. Show a => Capture a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Capture a] -> ShowS
$cshowList :: forall a. Show a => [Capture a] -> ShowS
show :: Capture a -> String
$cshow :: forall a. Show a => Capture a -> String
showsPrec :: Int -> Capture a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Capture a -> ShowS
Show,Capture a -> Capture a -> Bool
(Capture a -> Capture a -> Bool)
-> (Capture a -> Capture a -> Bool) -> Eq (Capture a)
forall a. Eq a => Capture a -> Capture a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Capture a -> Capture a -> Bool
$c/= :: forall a. Eq a => Capture a -> Capture a -> Bool
== :: Capture a -> Capture a -> Bool
$c== :: forall a. Eq a => Capture a -> Capture a -> Bool
Eq)
\end{code}

\begin{code}
instance Functor Capture where
  fmap :: (a -> b) -> Capture a -> Capture b
fmap a -> b
f c :: Capture a
c@Capture{a
Int
captureLength :: Int
captureOffset :: Int
capturedText :: a
captureSource :: a
captureLength :: forall a. Capture a -> Int
captureOffset :: forall a. Capture a -> Int
capturedText :: forall a. Capture a -> a
captureSource :: forall a. Capture a -> a
..} =
    Capture a
c
      { captureSource :: b
captureSource = a -> b
f a
captureSource
      , capturedText :: b
capturedText = a -> b
f a
capturedText
      }
\end{code}

\begin{code}
-- | test if the capture has matched any text
hasCaptured :: Capture a -> Bool
hasCaptured :: Capture a -> Bool
hasCaptured = (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>=Int
0) (Int -> Bool) -> (Capture a -> Int) -> Capture a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Capture a -> Int
forall a. Capture a -> Int
captureOffset

-- | returns the text preceding the match
capturePrefix :: Extract a => Capture a -> a
capturePrefix :: Capture a -> a
capturePrefix Capture{a
Int
captureLength :: Int
captureOffset :: Int
capturedText :: a
captureSource :: a
captureLength :: forall a. Capture a -> Int
captureOffset :: forall a. Capture a -> Int
capturedText :: forall a. Capture a -> a
captureSource :: forall a. Capture a -> a
..} = Int -> a -> a
forall source. Extract source => Int -> source -> source
before Int
captureOffset a
captureSource

-- | returns the text after the match
captureSuffix :: Extract a => Capture a -> a
captureSuffix :: Capture a -> a
captureSuffix Capture{a
Int
captureLength :: Int
captureOffset :: Int
capturedText :: a
captureSource :: a
captureLength :: forall a. Capture a -> Int
captureOffset :: forall a. Capture a -> Int
capturedText :: forall a. Capture a -> a
captureSource :: forall a. Capture a -> a
..} = Int -> a -> a
forall source. Extract source => Int -> source -> source
after (Int
captureOffsetInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
captureLength) a
captureSource
\end{code}