-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | two monoids as one, in holy haskimony
--   
--   In mathematics, a semiring is an algebraic structure consisting of a
--   set together with two binary operations, one commutative and one
--   associative. A semiring has two identity elements respective to its
--   operations. Thus a semiring can be seen as a combination of two
--   monoids, a commutative monoid and an associative monoid.
@package semirings
@version 0.2.1.1


-- | A class for semirings (types with two binary operations, one
--   commutative and one associative, and two respective identites), with
--   various general-purpose instances.
module Data.Semiring

-- | The class of semirings (types with two binary operations and two
--   respective identities). One can think of a semiring as two monoids of
--   the same underlying type: A commutative monoid and an associative
--   monoid. For any type R with a <a>Num</a> instance, the commutative
--   monoid is (R, '(Prelude.+)', 0) and the associative monoid is (R,
--   '(Prelude.*)', 1).
--   
--   Instances should satisfy the following laws:
--   
--   <ul>
--   <li><i><i>additive identity</i></i></li>
--   </ul>
--   
--   <pre>
--   x <a>+</a> <a>zero</a> = <a>zero</a> <a>+</a> x = x
--   </pre>
--   
--   <ul>
--   <li><i><i>additive associativity</i></i></li>
--   </ul>
--   
--   <pre>
--   x <a>+</a> (y <a>+</a> z) = (x <a>+</a> y) <a>+</a> z
--   </pre>
--   
--   <ul>
--   <li><i><i>additive commutativity</i></i></li>
--   </ul>
--   
--   <pre>
--   x <a>+</a> y = y <a>+</a> x
--   </pre>
--   
--   <ul>
--   <li><i><i>multiplicative identity</i></i></li>
--   </ul>
--   
--   <pre>
--   x <a>*</a> <a>one</a> = <a>one</a> <a>*</a> x = x
--   </pre>
--   
--   <ul>
--   <li><i><i>multiplicative associativity</i></i> <pre>x <a>*</a> (y
--   <a>*</a> z) = (x <a>*</a> y) <a>*</a> z</pre></li>
--   <li><i><i>left- and right-distributivity of <a>*</a> over
--   <a>+</a></i></i> <tt>x <a>*</a> (y <a>+</a> z) = (x <a>*</a> y)
--   <a>+</a> (x <a>*</a> z)</tt> <tt>(x <a>+</a> y) <a>*</a> z = (x
--   <a>*</a> z) <a>+</a> (y <a>*</a> z)</tt></li>
--   <li><i><i>annihilation</i></i> <pre><a>zero</a> <a>*</a> x = x
--   <a>*</a> <a>zero</a> = <a>zero</a></pre></li>
--   </ul>
class Semiring a
plus :: Semiring a => a -> a -> a
zero :: Semiring a => a
times :: Semiring a => a -> a -> a
one :: Semiring a => a
infixl 7 `times`
infixl 6 `plus`

-- | Infix shorthand for <a>plus</a>.
(+) :: Semiring a => a -> a -> a
infixl 6 +

-- | Infix shorthand for <a>times</a>.
(*) :: Semiring a => a -> a -> a
infixl 7 *

-- | Raise a number to a non-negative integral power. If the power is
--   negative, this will return <a>zero</a>.
(^) :: (Semiring a, Integral b) => a -> b -> a
infixr 8 ^

-- | Map each element of the structure to a semiring, and combine the
--   results using <a>plus</a>.
foldMapP :: (Foldable t, Semiring s) => (a -> s) -> t a -> s

-- | Map each element of the structure to a semiring, and combine the
--   results using <a>times</a>.
foldMapT :: (Foldable t, Semiring s) => (a -> s) -> t a -> s

-- | The <a>sum</a> function computes the additive sum of the elements in a
--   structure. This function is lazy. For a strict version, see
--   <a>sum'</a>.
sum :: (Foldable t, Semiring a) => t a -> a

-- | The <a>product</a> function computes the product of the elements in a
--   structure. This function is lazy. for a strict version, see
--   <a>product'</a>.
product :: (Foldable t, Semiring a) => t a -> a

-- | The <a>sum'</a> function computes the additive sum of the elements in
--   a structure. This function is strict. For a lazy version, see
--   <a>sum</a>.
sum' :: (Foldable t, Semiring a) => t a -> a

-- | The <a>product'</a> function computes the additive sum of the elements
--   in a structure. This function is strict. For a lazy version, see
--   <a>product</a>.
product' :: (Foldable t, Semiring a) => t a -> a

-- | Monoid under <a>plus</a>. Analogous to <a>Sum</a>, but uses the
--   <a>Semiring</a> constraint rather than <tt>Num</tt>.
newtype Add a
Add :: a -> Add a
[getAdd] :: Add a -> a

-- | Monoid under <a>times</a>. Analogous to <a>Product</a>, but uses the
--   <a>Semiring</a> constraint rather than <tt>Num</tt>.
newtype Mul a
Mul :: a -> Mul a
[getMul] :: Mul a -> a

-- | Provide Semiring and Ring for an arbitrary Num. It is useful with GHC
--   8.6+'s DerivingVia extension.
newtype WrappedNum a
WrapNum :: a -> WrappedNum a
[unwrapNum] :: WrappedNum a -> a

-- | The class of semirings with an additive inverse.
--   
--   <pre>
--   <a>negate</a> a <a>+</a> a = <a>zero</a>
--   </pre>
class Semiring a => Ring a
negate :: Ring a => a -> a

-- | Infix shorthand for <a>minus</a>.
(-) :: Ring a => a -> a -> a
infixl 6 -

-- | Substract two <a>Ring</a> values. For any type <tt>R</tt> with a
--   <a>Num</a> instance, this is the same as '(Prelude.-)'.
--   
--   <pre>
--   x <a>minus</a> y = x <a>+</a> <a>negate</a> y
--   </pre>
minus :: Ring a => a -> a -> a
infixl 6 `minus`
instance Data.Traversable.Traversable Data.Semiring.Add
instance Foreign.Storable.Storable a => Foreign.Storable.Storable (Data.Semiring.Add a)
instance GHC.Show.Show a => GHC.Show.Show (Data.Semiring.Add a)
instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Semiring.Add a)
instance GHC.Real.RealFrac a => GHC.Real.RealFrac (Data.Semiring.Add a)
instance GHC.Real.Real a => GHC.Real.Real (Data.Semiring.Add a)
instance GHC.Read.Read a => GHC.Read.Read (Data.Semiring.Add a)
instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semiring.Add a)
instance GHC.Num.Num a => GHC.Num.Num (Data.Semiring.Add a)
instance GHC.Generics.Generic1 Data.Semiring.Add
instance GHC.Generics.Generic (Data.Semiring.Add a)
instance GHC.Base.Functor Data.Semiring.Add
instance GHC.Real.Fractional a => GHC.Real.Fractional (Data.Semiring.Add a)
instance Data.Foldable.Foldable Data.Semiring.Add
instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semiring.Add a)
instance GHC.Enum.Enum a => GHC.Enum.Enum (Data.Semiring.Add a)
instance GHC.Enum.Bounded a => GHC.Enum.Bounded (Data.Semiring.Add a)
instance Data.Traversable.Traversable Data.Semiring.Mul
instance Foreign.Storable.Storable a => Foreign.Storable.Storable (Data.Semiring.Mul a)
instance GHC.Show.Show a => GHC.Show.Show (Data.Semiring.Mul a)
instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Semiring.Mul a)
instance GHC.Real.RealFrac a => GHC.Real.RealFrac (Data.Semiring.Mul a)
instance GHC.Real.Real a => GHC.Real.Real (Data.Semiring.Mul a)
instance GHC.Read.Read a => GHC.Read.Read (Data.Semiring.Mul a)
instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semiring.Mul a)
instance GHC.Num.Num a => GHC.Num.Num (Data.Semiring.Mul a)
instance GHC.Generics.Generic1 Data.Semiring.Mul
instance GHC.Generics.Generic (Data.Semiring.Mul a)
instance GHC.Base.Functor Data.Semiring.Mul
instance GHC.Real.Fractional a => GHC.Real.Fractional (Data.Semiring.Mul a)
instance Data.Foldable.Foldable Data.Semiring.Mul
instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semiring.Mul a)
instance GHC.Enum.Enum a => GHC.Enum.Enum (Data.Semiring.Mul a)
instance GHC.Enum.Bounded a => GHC.Enum.Bounded (Data.Semiring.Mul a)
instance Data.Traversable.Traversable Data.Semiring.WrappedNum
instance Foreign.Storable.Storable a => Foreign.Storable.Storable (Data.Semiring.WrappedNum a)
instance GHC.Show.Show a => GHC.Show.Show (Data.Semiring.WrappedNum a)
instance GHC.Real.RealFrac a => GHC.Real.RealFrac (Data.Semiring.WrappedNum a)
instance GHC.Real.Real a => GHC.Real.Real (Data.Semiring.WrappedNum a)
instance GHC.Read.Read a => GHC.Read.Read (Data.Semiring.WrappedNum a)
instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Semiring.WrappedNum a)
instance GHC.Num.Num a => GHC.Num.Num (Data.Semiring.WrappedNum a)
instance GHC.Generics.Generic1 Data.Semiring.WrappedNum
instance GHC.Generics.Generic (Data.Semiring.WrappedNum a)
instance GHC.Base.Functor Data.Semiring.WrappedNum
instance GHC.Real.Fractional a => GHC.Real.Fractional (Data.Semiring.WrappedNum a)
instance Data.Foldable.Foldable Data.Semiring.WrappedNum
instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Semiring.WrappedNum a)
instance GHC.Enum.Enum a => GHC.Enum.Enum (Data.Semiring.WrappedNum a)
instance GHC.Enum.Bounded a => GHC.Enum.Bounded (Data.Semiring.WrappedNum a)
instance Data.Semiring.Semiring (Data.Functor.Contravariant.Predicate a)
instance Data.Semiring.Ring (Data.Functor.Contravariant.Predicate a)
instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Functor.Contravariant.Equivalence a)
instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Functor.Contravariant.Equivalence a)
instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Functor.Contravariant.Op a b)
instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Functor.Contravariant.Op a b)
instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Semigroup.Internal.Product a)
instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Semigroup.Internal.Sum a)
instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Functor.Identity.Identity a)
instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Ord.Down a)
instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Semigroup.Max a)
instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Semigroup.Min a)
instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Ord.Down a)
instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Semigroup.Internal.Product a)
instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Semigroup.Internal.Sum a)
instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Functor.Identity.Identity a)
instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Semigroup.Max a)
instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Semigroup.Min a)
instance GHC.Num.Num a => Data.Semiring.Ring (Data.Semiring.WrappedNum a)
instance Data.Semiring.Ring b => Data.Semiring.Ring (a -> b)
instance Data.Semiring.Ring ()
instance Data.Semiring.Ring GHC.Types.Bool
instance Data.Semiring.Ring a => Data.Semiring.Ring [a]
instance Data.Semiring.Ring a => Data.Semiring.Ring (GHC.Maybe.Maybe a)
instance Data.Semiring.Ring a => Data.Semiring.Ring (GHC.Types.IO a)
instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Semigroup.Internal.Dual a)
instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Functor.Const.Const a b)
instance Data.Semiring.Ring a => Data.Semiring.Semiring (Data.Complex.Complex a)
instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Complex.Complex a)
instance (Data.Semiring.Ring a, GHC.Base.Applicative f) => Data.Semiring.Ring (Data.Monoid.Ap f a)
instance Data.Semiring.Ring GHC.Types.Int
instance Data.Semiring.Ring GHC.Int.Int8
instance Data.Semiring.Ring GHC.Int.Int16
instance Data.Semiring.Ring GHC.Int.Int32
instance Data.Semiring.Ring GHC.Int.Int64
instance Data.Semiring.Ring GHC.Integer.Type.Integer
instance Data.Semiring.Ring GHC.Types.Word
instance Data.Semiring.Ring GHC.Word.Word8
instance Data.Semiring.Ring GHC.Word.Word16
instance Data.Semiring.Ring GHC.Word.Word32
instance Data.Semiring.Ring GHC.Word.Word64
instance Data.Semiring.Ring GHC.Types.Float
instance Data.Semiring.Ring GHC.Types.Double
instance Data.Semiring.Ring Foreign.C.Types.CUIntMax
instance Data.Semiring.Ring Foreign.C.Types.CIntMax
instance Data.Semiring.Ring Foreign.C.Types.CUIntPtr
instance Data.Semiring.Ring Foreign.C.Types.CIntPtr
instance Data.Semiring.Ring Foreign.C.Types.CSUSeconds
instance Data.Semiring.Ring Foreign.C.Types.CUSeconds
instance Data.Semiring.Ring Foreign.C.Types.CTime
instance Data.Semiring.Ring Foreign.C.Types.CClock
instance Data.Semiring.Ring Foreign.C.Types.CSigAtomic
instance Data.Semiring.Ring Foreign.C.Types.CWchar
instance Data.Semiring.Ring Foreign.C.Types.CSize
instance Data.Semiring.Ring Foreign.C.Types.CPtrdiff
instance Data.Semiring.Ring Foreign.C.Types.CDouble
instance Data.Semiring.Ring Foreign.C.Types.CFloat
instance Data.Semiring.Ring Foreign.C.Types.CULLong
instance Data.Semiring.Ring Foreign.C.Types.CLLong
instance Data.Semiring.Ring Foreign.C.Types.CULong
instance Data.Semiring.Ring Foreign.C.Types.CLong
instance Data.Semiring.Ring Foreign.C.Types.CUInt
instance Data.Semiring.Ring Foreign.C.Types.CInt
instance Data.Semiring.Ring Foreign.C.Types.CUShort
instance Data.Semiring.Ring Foreign.C.Types.CShort
instance Data.Semiring.Ring Foreign.C.Types.CUChar
instance Data.Semiring.Ring Foreign.C.Types.CSChar
instance Data.Semiring.Ring Foreign.C.Types.CChar
instance Data.Semiring.Ring Foreign.Ptr.IntPtr
instance Data.Semiring.Ring Foreign.Ptr.WordPtr
instance Data.Semiring.Ring System.Posix.Types.Fd
instance Data.Semiring.Ring System.Posix.Types.CRLim
instance Data.Semiring.Ring System.Posix.Types.CTcflag
instance Data.Semiring.Ring System.Posix.Types.CSpeed
instance Data.Semiring.Ring System.Posix.Types.CCc
instance Data.Semiring.Ring System.Posix.Types.CUid
instance Data.Semiring.Ring System.Posix.Types.CNlink
instance Data.Semiring.Ring System.Posix.Types.CGid
instance Data.Semiring.Ring System.Posix.Types.CSsize
instance Data.Semiring.Ring System.Posix.Types.CPid
instance Data.Semiring.Ring System.Posix.Types.COff
instance Data.Semiring.Ring System.Posix.Types.CMode
instance Data.Semiring.Ring System.Posix.Types.CIno
instance Data.Semiring.Ring System.Posix.Types.CDev
instance Data.Semiring.Ring GHC.Natural.Natural
instance GHC.Real.Integral a => Data.Semiring.Ring (GHC.Real.Ratio a)
instance Data.Fixed.HasResolution a => Data.Semiring.Ring (Data.Fixed.Fixed a)
instance Data.Semiring.Ring a => Data.Semiring.Ring (Data.Vector.Vector a)
instance (Data.Vector.Unboxed.Base.Unbox a, Data.Semiring.Ring a) => Data.Semiring.Ring (Data.Vector.Unboxed.Base.Vector a)
instance (Foreign.Storable.Storable a, Data.Semiring.Ring a) => Data.Semiring.Ring (Data.Vector.Storable.Vector a)
instance Data.Semiring.Semiring a => GHC.Base.Semigroup (Data.Semiring.Add a)
instance Data.Semiring.Semiring a => GHC.Base.Monoid (Data.Semiring.Add a)
instance Data.Semiring.Semiring a => GHC.Base.Semigroup (Data.Semiring.Mul a)
instance Data.Semiring.Semiring a => GHC.Base.Monoid (Data.Semiring.Mul a)
instance GHC.Num.Num a => Data.Semiring.Semiring (Data.Semiring.WrappedNum a)
instance Data.Semiring.Semiring b => Data.Semiring.Semiring (a -> b)
instance Data.Semiring.Semiring ()
instance Data.Semiring.Semiring (Data.Proxy.Proxy a)
instance Data.Semiring.Semiring GHC.Types.Bool
instance Data.Semiring.Semiring a => Data.Semiring.Semiring [a]
instance Data.Semiring.Semiring a => Data.Semiring.Semiring (GHC.Maybe.Maybe a)
instance Data.Semiring.Semiring a => Data.Semiring.Semiring (GHC.Types.IO a)
instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Semigroup.Internal.Dual a)
instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Functor.Const.Const a b)
instance (Data.Semiring.Semiring a, GHC.Base.Applicative f) => Data.Semiring.Semiring (Data.Monoid.Ap f a)
instance Data.Semiring.Semiring GHC.Types.Int
instance Data.Semiring.Semiring GHC.Int.Int8
instance Data.Semiring.Semiring GHC.Int.Int16
instance Data.Semiring.Semiring GHC.Int.Int32
instance Data.Semiring.Semiring GHC.Int.Int64
instance Data.Semiring.Semiring GHC.Integer.Type.Integer
instance Data.Semiring.Semiring GHC.Types.Word
instance Data.Semiring.Semiring GHC.Word.Word8
instance Data.Semiring.Semiring GHC.Word.Word16
instance Data.Semiring.Semiring GHC.Word.Word32
instance Data.Semiring.Semiring GHC.Word.Word64
instance Data.Semiring.Semiring GHC.Types.Float
instance Data.Semiring.Semiring GHC.Types.Double
instance Data.Semiring.Semiring Foreign.C.Types.CUIntMax
instance Data.Semiring.Semiring Foreign.C.Types.CIntMax
instance Data.Semiring.Semiring Foreign.C.Types.CUIntPtr
instance Data.Semiring.Semiring Foreign.C.Types.CIntPtr
instance Data.Semiring.Semiring Foreign.C.Types.CSUSeconds
instance Data.Semiring.Semiring Foreign.C.Types.CUSeconds
instance Data.Semiring.Semiring Foreign.C.Types.CTime
instance Data.Semiring.Semiring Foreign.C.Types.CClock
instance Data.Semiring.Semiring Foreign.C.Types.CSigAtomic
instance Data.Semiring.Semiring Foreign.C.Types.CWchar
instance Data.Semiring.Semiring Foreign.C.Types.CSize
instance Data.Semiring.Semiring Foreign.C.Types.CPtrdiff
instance Data.Semiring.Semiring Foreign.C.Types.CDouble
instance Data.Semiring.Semiring Foreign.C.Types.CFloat
instance Data.Semiring.Semiring Foreign.C.Types.CULLong
instance Data.Semiring.Semiring Foreign.C.Types.CLLong
instance Data.Semiring.Semiring Foreign.C.Types.CULong
instance Data.Semiring.Semiring Foreign.C.Types.CLong
instance Data.Semiring.Semiring Foreign.C.Types.CUInt
instance Data.Semiring.Semiring Foreign.C.Types.CInt
instance Data.Semiring.Semiring Foreign.C.Types.CUShort
instance Data.Semiring.Semiring Foreign.C.Types.CShort
instance Data.Semiring.Semiring Foreign.C.Types.CUChar
instance Data.Semiring.Semiring Foreign.C.Types.CSChar
instance Data.Semiring.Semiring Foreign.C.Types.CChar
instance Data.Semiring.Semiring Foreign.Ptr.IntPtr
instance Data.Semiring.Semiring Foreign.Ptr.WordPtr
instance Data.Semiring.Semiring System.Posix.Types.Fd
instance Data.Semiring.Semiring System.Posix.Types.CRLim
instance Data.Semiring.Semiring System.Posix.Types.CTcflag
instance Data.Semiring.Semiring System.Posix.Types.CSpeed
instance Data.Semiring.Semiring System.Posix.Types.CCc
instance Data.Semiring.Semiring System.Posix.Types.CUid
instance Data.Semiring.Semiring System.Posix.Types.CNlink
instance Data.Semiring.Semiring System.Posix.Types.CGid
instance Data.Semiring.Semiring System.Posix.Types.CSsize
instance Data.Semiring.Semiring System.Posix.Types.CPid
instance Data.Semiring.Semiring System.Posix.Types.COff
instance Data.Semiring.Semiring System.Posix.Types.CMode
instance Data.Semiring.Semiring System.Posix.Types.CIno
instance Data.Semiring.Semiring System.Posix.Types.CDev
instance Data.Semiring.Semiring GHC.Natural.Natural
instance GHC.Real.Integral a => Data.Semiring.Semiring (GHC.Real.Ratio a)
instance Data.Fixed.HasResolution a => Data.Semiring.Semiring (Data.Fixed.Fixed a)
instance (GHC.Classes.Ord a, GHC.Base.Monoid a) => Data.Semiring.Semiring (Data.Set.Internal.Set a)
instance (GHC.Classes.Ord k, GHC.Base.Monoid k, Data.Semiring.Semiring v) => Data.Semiring.Semiring (Data.Map.Internal.Map k v)
instance (GHC.Classes.Eq a, Data.Hashable.Class.Hashable a, GHC.Base.Monoid a) => Data.Semiring.Semiring (Data.HashSet.HashSet a)
instance (GHC.Classes.Eq k, Data.Hashable.Class.Hashable k, GHC.Base.Monoid k, Data.Semiring.Semiring v) => Data.Semiring.Semiring (Data.HashMap.Base.HashMap k v)
instance Data.Semiring.Semiring a => Data.Semiring.Semiring (Data.Vector.Vector a)
instance (Data.Vector.Unboxed.Base.Unbox a, Data.Semiring.Semiring a) => Data.Semiring.Semiring (Data.Vector.Unboxed.Base.Vector a)
instance (Foreign.Storable.Storable a, Data.Semiring.Semiring a) => Data.Semiring.Semiring (Data.Vector.Storable.Vector a)


-- | This module provides generic deriving tools for semirings and rings
--   for product-like structures.
module Data.Semiring.Generic
class GSemiring f
gzero' :: GSemiring f => f a
gone' :: GSemiring f => f a
gplus' :: GSemiring f => f a -> f a -> f a
gtimes' :: GSemiring f => f a -> f a -> f a

-- | Generically generate a <a>Semiring</a> <a>zero</a> for any
--   product-like type implementing <a>Generic</a>.
--   
--   It is only defined for product types.
--   
--   <pre>
--   <a>gplus</a> <a>gzero</a> a = a = <a>gplus</a> a <a>gzero</a>
--   </pre>
gzero :: (Generic a, GSemiring (Rep a)) => a

-- | Generically generate a <a>Semiring</a> <a>one</a> for any product-like
--   type implementing <a>Generic</a>.
--   
--   It is only defined for product types.
--   
--   <pre>
--   <a>gtimes</a> <a>gone</a> a = a = <a>gtimes</a> a <a>gone</a>
--   </pre>
gone :: (Generic a, GSemiring (Rep a)) => a

-- | Generically generate a <a>Semiring</a> <a>plus</a> operation for any
--   type implementing <a>Generic</a>. It is only defined for product
--   types.
--   
--   <pre>
--   <a>gplus</a> a b = <a>gplus</a> b a
--   </pre>
gplus :: (Generic a, GSemiring (Rep a)) => a -> a -> a

-- | Generically generate a <a>Semiring</a> <a>times</a> operation for any
--   type implementing <a>Generic</a>. It is only defined for product
--   types.
--   
--   <pre>
--   <a>gtimes</a> a (<a>gtimes</a> b c) = <a>gtimes</a> (<a>gtimes</a> a b) c
--   <a>gtimes</a> a <a>gzero</a> = <a>gzero</a> = <a>gtimes</a> <a>gzero</a> a
--   </pre>
gtimes :: (Generic a, GSemiring (Rep a)) => a -> a -> a
class GRing f
gnegate' :: GRing f => f a -> f a

-- | Generically generate a <a>Ring</a> <a>negate</a> operation for any
--   type implementing <a>Generic</a>. It is only defined for product
--   types.
--   
--   <pre>
--   <a>gplus</a> a (<a>gnegate</a> a) = <a>zero</a>
--   </pre>
gnegate :: (Generic a, GRing (Rep a)) => a -> a
instance Data.Semiring.Generic.GRing GHC.Generics.U1
instance (Data.Semiring.Generic.GRing a, Data.Semiring.Generic.GRing b) => Data.Semiring.Generic.GRing (a GHC.Generics.:*: b)
instance Data.Semiring.Generic.GRing a => Data.Semiring.Generic.GRing (GHC.Generics.M1 i c a)
instance Data.Semiring.Ring a => Data.Semiring.Generic.GRing (GHC.Generics.K1 i a)
instance Data.Semiring.Generic.GSemiring GHC.Generics.U1
instance (Data.Semiring.Generic.GSemiring a, Data.Semiring.Generic.GSemiring b) => Data.Semiring.Generic.GSemiring (a GHC.Generics.:*: b)
instance Data.Semiring.Generic.GSemiring a => Data.Semiring.Generic.GSemiring (GHC.Generics.M1 i c a)
instance Data.Semiring.Semiring a => Data.Semiring.Generic.GSemiring (GHC.Generics.K1 i a)
instance (Data.Semiring.Semiring a, Data.Semiring.Semiring b) => Data.Semiring.Semiring (a, b)
instance (Data.Semiring.Semiring a, Data.Semiring.Semiring b, Data.Semiring.Semiring c) => Data.Semiring.Semiring (a, b, c)
instance (Data.Semiring.Semiring a, Data.Semiring.Semiring b, Data.Semiring.Semiring c, Data.Semiring.Semiring d) => Data.Semiring.Semiring (a, b, c, d)
instance (Data.Semiring.Semiring a, Data.Semiring.Semiring b, Data.Semiring.Semiring c, Data.Semiring.Semiring d, Data.Semiring.Semiring e) => Data.Semiring.Semiring (a, b, c, d, e)
instance (Data.Semiring.Semiring a, Data.Semiring.Semiring b, Data.Semiring.Semiring c, Data.Semiring.Semiring d, Data.Semiring.Semiring e, Data.Semiring.Semiring f) => Data.Semiring.Semiring (a, b, c, d, e, f)
instance (Data.Semiring.Semiring a, Data.Semiring.Semiring b, Data.Semiring.Semiring c, Data.Semiring.Semiring d, Data.Semiring.Semiring e, Data.Semiring.Semiring f, Data.Semiring.Semiring g) => Data.Semiring.Semiring (a, b, c, d, e, f, g)
instance (Data.Semiring.Ring a, Data.Semiring.Ring b) => Data.Semiring.Ring (a, b)
instance (Data.Semiring.Ring a, Data.Semiring.Ring b, Data.Semiring.Ring c) => Data.Semiring.Ring (a, b, c)
instance (Data.Semiring.Ring a, Data.Semiring.Ring b, Data.Semiring.Ring c, Data.Semiring.Ring d) => Data.Semiring.Ring (a, b, c, d)
instance (Data.Semiring.Ring a, Data.Semiring.Ring b, Data.Semiring.Ring c, Data.Semiring.Ring d, Data.Semiring.Ring e) => Data.Semiring.Ring (a, b, c, d, e)
instance (Data.Semiring.Ring a, Data.Semiring.Ring b, Data.Semiring.Ring c, Data.Semiring.Ring d, Data.Semiring.Ring e, Data.Semiring.Ring f) => Data.Semiring.Ring (a, b, c, d, e, f)
instance (Data.Semiring.Ring a, Data.Semiring.Ring b, Data.Semiring.Ring c, Data.Semiring.Ring d, Data.Semiring.Ring e, Data.Semiring.Ring f, Data.Semiring.Ring g) => Data.Semiring.Ring (a, b, c, d, e, f, g)

module Data.Star

-- | A <a>Star semiring</a> adds one operation, <a>star</a> to a
--   <a>Semiring</a>, such that it follows the law:
--   
--   <pre>
--   <a>star</a> x = <a>one</a> <a>+</a> x <a>*</a> <a>star</a> x = <a>one</a> <a>+</a> <a>star</a> x <a>*</a> x
--   </pre>
--   
--   Another operation, <a>aplus</a>, can be defined in terms of
--   <a>star</a>:
--   
--   <pre>
--   <a>aplus</a> x = x <a>*</a> <a>star</a> x
--   </pre>
class (Semiring a) => Star a
star :: Star a => a -> a
aplus :: Star a => a -> a
instance Data.Star.Star b => Data.Star.Star (a -> b)
instance Data.Star.Star GHC.Types.Bool
instance Data.Star.Star ()
instance Data.Star.Star (Data.Proxy.Proxy a)
