# Generic Monoid (and Semigroup)
This library provides a method of deriving `Semigroup` and `Monoid` instances
for your large product types. It does this using GHC generics, and can provides
a mechanism for using the `DerivingVia` extension to reduce boilerplate.
It only works if each field of your product type is itself a `Semigroup`/`Monoid`.
```haskell
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE DeriveGeneric #-}
import GHC.Generics
import Data.Monoid.Generic
data BigProduct = BigProduct
{ theList :: [Int]
, theSum :: Sum Double
, theString :: String
} deriving (Generic, Eq)
deriving Semigroup via GenericSemigroup BigProduct
deriving Monoid via GenericMonoid BigProduct
useIt :: Bool
useIt = (mempty <> mempty) == BigProduct [] 0 ""
```