1 module Text.RegExp.Matching.Longest.Type where 2 3 import Data.Semiring 4 import Text.RegExp.Data 5 6 -- | Semiring used for longest matching. 7 -- 8 data Longest = Zero | One | Longest !Int 9 deriving (Eq,Show) 10 11 instance Semiring Longest where 12 zero = Zero; one = One 13 14 Zero .+. y = y 15 x .+. Zero = x 16 One .+. y = y 17 x .+. One = x 18 Longest a .+. Longest b = Longest (max a b) 19 20 Zero .*. _ = Zero 21 _ .*. Zero = Zero 22 One .*. y = y 23 x .*. One = x 24 Longest a .*. Longest b = Longest (a+b) 25 26 instance Weight c c Longest where 27 symWeight p c = p c .*. Longest 1