{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE Trustworthy #-}
{-# LANGUAGE TypeFamilies #-}
{-|
Module:      Data.Eliminator.Monoid
Copyright:   (C) 2021 Ryan Scott
License:     BSD-style (see the file LICENSE)
Maintainer:  Ryan Scott
Stability:   Experimental
Portability: GHC

Eliminator functions for data types in "Data.Monoid". All of these are
re-exported from "Data.Eliminator" with the following exceptions:

* 'First' and 'Last' are not re-exported from "Data.Eliminator", as they clash
  with eliminators of the same names in "Data.Eliminator.Functor" and
  "Data.Eliminator.Semigroup".

* 'Sum' and 'Product' are not re-exported from "Data.Eliminator", as they clash
  with eliminators of the same names in "Data.Eliminator.Functor".
-}
module Data.Eliminator.Monoid (
    elimAll
  , ElimAll
  , elimAny
  , ElimAny
  , elimDual
  , ElimDual
  , elimFirst
  , ElimFirst
  , elimLast
  , ElimLast
  , elimProduct
  , ElimProduct
  , elimSum
  , ElimSum
  ) where

import Control.Monad.Extra

import Data.Eliminator.TH
import Data.Monoid
import Data.Monoid.Singletons

$(concatMapM (\n -> (++) <$> deriveElim n <*> deriveTypeElim n)
             [ ''All
             , ''Any
             , ''Dual
             , ''First
             , ''Last
             , ''Product
             , ''Sum
             ])