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