module Text.RegExp.Matching.Longest (
Longest(..), Matching(..),
matching, getLongest
) where
import Text.RegExp
data Matching = Matching {
matchingLength :: !Int
}
deriving Eq
instance Show Matching
where
showsPrec _ m = showString "<length:" . shows (matchingLength m)
. showString ">"
matching :: RegExp c -> [c] -> Maybe Matching
matching r = getLongest . partialMatch r
data Longest = Zero | One | Longest !Int
deriving (Eq,Show)
getLongest :: Longest -> Maybe Matching
getLongest Zero = Nothing
getLongest One = Just $ Matching 0
getLongest (Longest x) = Just $ Matching x
instance Semiring Longest where
zero = Zero; one = One
Zero .+. y = y
x .+. Zero = x
One .+. y = y
x .+. One = x
Longest a .+. Longest b = Longest (max a b)
Zero .*. _ = Zero
_ .*. Zero = Zero
One .*. y = y
x .*. One = x
Longest a .*. Longest b = Longest (a+b)
instance Weight c c Longest where
symWeight p c = p c .*. Longest 1