{-# LANGUAGE MultiParamTypeClasses #-}
-----------------------------------------------------------------------------
-- |
-- Module      :  Data.Ring.Semi
-- Copyright   :  (c) Edward Kmett 2009
-- License     :  BSD-style
-- Maintainer  :  ekmett@gmail.com
-- Stability   :  experimental
-- Portability :  non-portable (MPTCs)
--
--
-----------------------------------------------------------------------------

module Data.Ring.Semi
    ( module Data.Ring.Semi.Near
    , SemiRing
    ) where

import Data.Ring.Semi.Near
import Data.Monoid.Self
import Data.Monoid.FromString

-- | A 'SemiRing' is an instance of both 'Multiplicative' and 'Monoid' where 
--   'times' distributes over 'plus'.
class (RightSemiNearRing a, LeftSemiNearRing a) => SemiRing a

instance SemiRing r => SemiRing (Self r)
instance SemiRing r => SemiRing (FromString r)
instance SemiRing r => SemiRing (ReducedBy r s)
instance SemiRing r => SemiRing (Dual r)