{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE Trustworthy #-}
{-# LANGUAGE TypeFamilies #-}
module Data.Eliminator.Semigroup (
elimAll
, ElimAll
, elimAny
, ElimAny
, elimArg
, ElimArg
, elimDual
, ElimDual
, elimFirst
, ElimFirst
, elimLast
, ElimLast
, elimMax
, ElimMax
, elimMin
, ElimMin
, elimProduct
, ElimProduct
, elimSum
, ElimSum
, elimWrappedMonoid
, ElimWrappedMonoid
) where
import Control.Monad.Extra
import Data.Eliminator.Monoid hiding (elimFirst, ElimFirst, elimLast, ElimLast)
import Data.Eliminator.TH
import Data.Semigroup
import Data.Semigroup.Singletons
$(concatMapM (\n -> (++) <$> deriveElim n <*> deriveTypeElim n)
[ ''Arg
, ''First
, ''Last
, ''Max
, ''Min
, ''WrappedMonoid
])