39 lines
987 B
Haskell
39 lines
987 B
Haskell
{-# LANGUAGE TypeOperators, FlexibleContexts #-}
|
|
{- | Pulled from
|
|
https://stackoverflow.com/questions/10112733/haskell-simple-constructor-comparison-function
|
|
-}
|
|
module SameConstr
|
|
( eqConstr
|
|
) where
|
|
|
|
import GHC.Generics
|
|
import Data.Function (on)
|
|
|
|
--class EqC a where
|
|
-- eqConstr :: a -> a -> Bool
|
|
-- default eqConstr :: (Generic a, GEqC (Rep a)) => a -> a -> Bool
|
|
-- eqConstr = geqConstr `on` from
|
|
|
|
eqConstr :: (Generic a, GEqC (Rep a)) => a -> a -> Bool
|
|
eqConstr = geqConstr `on` from
|
|
|
|
class GEqC f where
|
|
geqConstr :: f p -> f p -> Bool
|
|
{-# INLINE geqConstr #-}
|
|
geqConstr _ _ = True
|
|
|
|
instance GEqC f => GEqC (M1 i c f) where
|
|
{-# INLINE geqConstr #-}
|
|
geqConstr (M1 x) (M1 y) = geqConstr x y
|
|
|
|
instance GEqC (K1 i c)
|
|
instance GEqC (f :*: g)
|
|
instance GEqC U1
|
|
instance GEqC V1
|
|
|
|
instance (GEqC f, GEqC g) => GEqC (f :+: g) where
|
|
{-# INLINE geqConstr #-}
|
|
geqConstr (L1 x) (L1 y) = geqConstr x y
|
|
geqConstr (R1 x) (R1 y) = geqConstr x y
|
|
geqConstr _ _ = False
|