{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE Trustworthy #-}
{-# LANGUAGE TypeFamilies #-}
module Data.Eliminator.Functor (
elimConst
, ElimConst
, elimIdentity
, ElimIdentity
, elimProduct
, ElimProduct
, elimSum
, ElimSum
) where
import Control.Monad.Extra
import Data.Eliminator.TH
import Data.Functor.Const (Const(..))
import Data.Functor.Const.Singletons (SConst(..))
import Data.Functor.Identity (Identity(..))
import Data.Functor.Identity.Singletons (SIdentity(..))
import Data.Functor.Product (Product(..))
import Data.Functor.Product.Singletons (SProduct(..))
import Data.Functor.Sum (Sum(..))
import Data.Functor.Sum.Singletons (SSum(..))
$(concatMapM (\n -> (++) <$> deriveElim n <*> deriveTypeElim n)
[ ''Const
, ''Identity
, ''Product
, ''Sum
])