{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}

module Text.RegExp.Matching.Leftmost.Type where

import Data.Semiring
import Text.RegExp.Data

-- | Semiring used for leftmost matching.
-- 
data Leftmost = Zero | One | Leftmost !Int
 deriving (Eq,Show)

instance Semiring Leftmost where
  zero = Zero; one = One

  Zero        .+.  y           =  y
  x           .+.  Zero        =  x
  One         .+.  y           =  y
  x           .+.  One         =  x
  Leftmost a  .+.  Leftmost b  =  Leftmost (min a b)

  Zero        .*.  _           =  Zero
  _           .*.  Zero        =  Zero
  One         .*.  y           =  y
  x           .*.  One         =  x
  Leftmost a  .*.  Leftmost b  =  Leftmost (min a b)

instance Weight c (Int,c) Leftmost where
  symWeight p (n,c) = p c .*. Leftmost n