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


-- | Derive monoid instances for product types.
--   
--   Using GHC's generics, allow for deriving <a>Monoid</a> and
--   <a>Semigroup</a> instances for your product types.
@package generic-monoid
@version 0.1.0.1

module Data.Semigroup.Generic

-- | A generic <tt><a>&lt;&gt;</a></tt> function which works for product
--   types where each contained type is itself a <tt><a>Semigroup</a></tt>.
--   It simply calls <tt><a>&lt;&gt;</a></tt> for each field.
--   
--   If you don't want to use the <tt>deriving via</tt> mechanism, use this
--   function to implement the <a>Semigroup</a> type class.
genericMappend :: (Generic a, MappendProduct (Rep a)) => a -> a -> a

-- | A newtype which allows you to using the <tt>DerivingVia</tt> extension
--   to reduce boilerplate.
--   
--   <pre>
--   data X = X [Int] String
--     deriving (Generic, Show)
--     deriving Semigroup via GenericSemigroup X
--   </pre>
newtype GenericSemigroup a
GenericSemigroup :: a -> GenericSemigroup a
instance (GHC.Generics.Generic a, Data.Semigroup.Generic.MappendProduct (GHC.Generics.Rep a)) => GHC.Base.Semigroup (Data.Semigroup.Generic.GenericSemigroup a)
instance (TypeError ...) => Data.Semigroup.Generic.MappendProduct (a GHC.Generics.:+: b)
instance Data.Semigroup.Generic.MappendProduct c => Data.Semigroup.Generic.MappendProduct (GHC.Generics.D1 md c)
instance Data.Semigroup.Generic.MappendProduct s => Data.Semigroup.Generic.MappendProduct (GHC.Generics.C1 mc s)
instance (Data.Semigroup.Generic.MappendProduct a, Data.Semigroup.Generic.MappendProduct b) => Data.Semigroup.Generic.MappendProduct (a GHC.Generics.:*: b)
instance GHC.Base.Semigroup t => Data.Semigroup.Generic.MappendProduct (GHC.Generics.S1 m (GHC.Generics.Rec0 t))

module Data.Monoid.Generic

-- | A generic <tt><a>&lt;&gt;</a></tt> function which works for product
--   types where each contained type is itself a <tt><a>Semigroup</a></tt>.
--   It simply calls <tt><a>&lt;&gt;</a></tt> for each field.
--   
--   If you don't want to use the <tt>deriving via</tt> mechanism, use this
--   function to implement the <a>Semigroup</a> type class.
genericMappend :: (Generic a, MappendProduct (Rep a)) => a -> a -> a

-- | A generic <tt><a>mempty</a></tt> function which works for product
--   types where each contained type is itself a <tt><a>Monoid</a></tt>. It
--   simply calls <tt><a>mempty</a></tt> for each field.
--   
--   If you don't want to use the <tt>deriving via</tt> mechanism, use this
--   function to implement the <a>Monoid</a> type class.
genericMempty :: (Generic a, MemptyProduct (Rep a)) => a

-- | A newtype which allows you to using the <tt>DerivingVia</tt> extension
--   to reduce boilerplate.
--   
--   <pre>
--   data X = X [Int] String
--     deriving (Generic, Show)
--     deriving Semigroup via GenericSemigroup X
--   </pre>
newtype GenericSemigroup a
GenericSemigroup :: a -> GenericSemigroup a

-- | A newtype which allows you to using the <tt>DerivingVia</tt> extension
--   to reduce boilerplate.
--   
--   <pre>
--   data X = X [Int] String
--     deriving (Generic, Show)
--     deriving Semigroup via GenericSemigroup X
--     deriving Monoid    via GenericMonoid X
--   </pre>
--   
--   Note: Do NOT attempt to <tt>derive Semigroup via GenericMonoid</tt>.
--   That will lead to infinite recursion.
newtype GenericMonoid a
GenericMonoid :: a -> GenericMonoid a
instance GHC.Show.Show a => GHC.Show.Show (Data.Monoid.Generic.GenericMonoid a)
instance (GHC.Base.Semigroup a, GHC.Generics.Generic a, Data.Monoid.Generic.MemptyProduct (GHC.Generics.Rep a)) => GHC.Base.Monoid (Data.Monoid.Generic.GenericMonoid a)
instance Data.Monoid.Generic.MemptyProduct c => Data.Monoid.Generic.MemptyProduct (GHC.Generics.D1 md c)
instance Data.Monoid.Generic.MemptyProduct s => Data.Monoid.Generic.MemptyProduct (GHC.Generics.C1 md s)
instance (TypeError ...) => Data.Monoid.Generic.MemptyProduct (a GHC.Generics.:+: b)
instance (Data.Monoid.Generic.MemptyProduct a, Data.Monoid.Generic.MemptyProduct b) => Data.Monoid.Generic.MemptyProduct (a GHC.Generics.:*: b)
instance GHC.Base.Monoid t => Data.Monoid.Generic.MemptyProduct (GHC.Generics.S1 m (GHC.Generics.Rec0 t))
instance GHC.Base.Semigroup a => GHC.Base.Semigroup (Data.Monoid.Generic.GenericMonoid a)
