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


-- | Anything that associates
--   
--   In mathematics, a semigroup is an algebraic structure consisting of a
--   set together with an associative binary operation. A semigroup
--   generalizes a monoid in that there might not exist an identity
--   element. It also (originally) generalized a group (a monoid with all
--   inverses) to a type where every element did not have to have an
--   inverse, thus the name semigroup.
@package semigroups
@version 0.20


-- | This module provides generic deriving tools for monoids and semigroups
--   for product-like structures.
module Data.Semigroup.Generic

-- | Generically generate a <a>Semigroup</a> (<a>&lt;&gt;</a>) operation
--   for any type implementing <a>Generic</a>. This operation will append
--   two values by point-wise appending their component fields. It is only
--   defined for product types.
--   
--   <pre>
--   <a>gmappend</a> a (<a>gmappend</a> b c) = <a>gmappend</a> (<a>gmappend</a> a b) c
--   </pre>
gmappend :: (Generic a, GSemigroup (Rep a)) => a -> a -> a

-- | Generically generate a <a>Monoid</a> <a>mempty</a> for any
--   product-like type implementing <a>Generic</a>.
--   
--   It is only defined for product types.
--   
--   <pre>
--   <a>gmappend</a> <a>gmempty</a> a = a = <a>gmappend</a> a <a>gmempty</a>
--   </pre>
gmempty :: (Generic a, GMonoid (Rep a)) => a

-- | An adapter newtype, suitable for <tt>DerivingVia</tt>. Its
--   <a>Semigroup</a> and <a>Monoid</a> instances leverage the
--   <a>Generic</a>-based defaults defined by <a>gmappend</a> and
--   <a>gmempty</a>. Here is an example of how to use it:
--   
--   <pre>
--   {-# LANGUAGE DerivingVia #-}
--   import <a>Data.Semigroup.Generic</a>
--   
--   data Pair a = MkPair a a
--     deriving (<a>Semigroup</a>, <a>Monoid</a>) via (<a>GenericSemigroupMonoid</a> (Pair a))
--   </pre>
newtype GenericSemigroupMonoid a
GenericSemigroupMonoid :: a -> GenericSemigroupMonoid a
[getGenericSemigroupMonoid] :: GenericSemigroupMonoid a -> a
class GSemigroup f
class GSemigroup f => GMonoid f
instance (GHC.Generics.Generic a, Data.Semigroup.Generic.GSemigroup (GHC.Generics.Rep a)) => GHC.Base.Semigroup (Data.Semigroup.Generic.GenericSemigroupMonoid a)
instance (GHC.Generics.Generic a, Data.Semigroup.Generic.GMonoid (GHC.Generics.Rep a)) => GHC.Base.Monoid (Data.Semigroup.Generic.GenericSemigroupMonoid a)
instance Data.Semigroup.Generic.GMonoid GHC.Generics.U1
instance (GHC.Base.Semigroup a, GHC.Base.Monoid a) => Data.Semigroup.Generic.GMonoid (GHC.Generics.K1 i a)
instance Data.Semigroup.Generic.GMonoid f => Data.Semigroup.Generic.GMonoid (GHC.Generics.M1 i c f)
instance (Data.Semigroup.Generic.GMonoid f, Data.Semigroup.Generic.GMonoid g) => Data.Semigroup.Generic.GMonoid (f GHC.Generics.:*: g)
instance Data.Semigroup.Generic.GSemigroup GHC.Generics.U1
instance Data.Semigroup.Generic.GSemigroup GHC.Generics.V1
instance GHC.Base.Semigroup a => Data.Semigroup.Generic.GSemigroup (GHC.Generics.K1 i a)
instance Data.Semigroup.Generic.GSemigroup f => Data.Semigroup.Generic.GSemigroup (GHC.Generics.M1 i c f)
instance (Data.Semigroup.Generic.GSemigroup f, Data.Semigroup.Generic.GSemigroup g) => Data.Semigroup.Generic.GSemigroup (f GHC.Generics.:*: g)
