-- | -- Module : Text.RegExp.Matching.LeftLong -- Copyright : Thomas Wilke, Frank Huch, and Sebastian Fischer -- License : BSD3 -- Maintainer : Sebastian Fischer -- Stability : experimental -- -- This module implements leftmost longest matching based on weighted -- regular expressions. It should be imported qualified as the -- interface resembles that provided by other matching modules. -- module Text.RegExp.Matching.LeftLong ( matching, Matching, matchingIndex, matchingLength, LeftLong, getLeftLong ) where import Text.RegExp import Text.RegExp.Matching.LeftLong.Type -- | -- Subwords of words that match a regular expression are represented -- as values of type 'Matching'. -- data Matching = Matching { -- | Start index of the matching subword in the queried word. matchingIndex :: !Int, -- | Length of the matching subword. matchingLength :: !Int } deriving Eq instance Show Matching where showsPrec _ m = showString "" -- | -- Returns the leftmost longest of all non-empty matchings for a -- regular expression in a given word. If the empty word is the only -- matching its position is zero. -- matching :: RegExp c -> [c] -> Maybe Matching matching r = getLeftLong . partialMatch r . zip [(0::Int)..] getLeftLong :: LeftLong -> Maybe Matching getLeftLong Zero = Nothing getLeftLong One = Just $ Matching 0 0 getLeftLong (LeftLong x y) = Just $ Matching x (y-x+1)