{-# LANGUAGE GADTs            #-}
{-# LANGUAGE TypeFamilies     #-}
{-# LANGUAGE ConstraintKinds  #-}
{-# LANGUAGE TypeOperators    #-}
{-# LANGUAGE FlexibleContexts #-}
module Generics.Simplistic.Derive.Eq where

import Data.Proxy

import Generics.Simplistic
import Generics.Simplistic.Util

geq' :: (OnLeaves Eq f) => SRep I f -> SRep I f -> Bool
geq' x y = maybe False sameLeaves $ zipSRep x y
  where
    sameLeaves :: (OnLeaves Eq f) => SRep (I :*: I) f -> Bool
    sameLeaves = repLeavesC (Proxy :: Proxy Eq) (uncurry' (==)) (&&) True

geq :: (Generic a, GShallow (Rep a), OnLeaves Eq (Rep a))
    => a -> a -> Bool
geq x y = geq' (fromS x) (fromS y)