{-# LANGUAGE FlexibleContexts     #-}
{-# LANGUAGE FlexibleInstances    #-}
{-# LANGUAGE ScopedTypeVariables  #-}
{-# LANGUAGE TypeApplications     #-}
{-# LANGUAGE TypeOperators        #-}
{-# LANGUAGE UndecidableInstances #-}

{-# OPTIONS_GHC -Wno-orphans #-}

module Data.Row.Hashable where

import           Data.Hashable

import           Data.Row
import qualified Data.Row.Records      as Rec

instance (Forall r Hashable, Forall r Eq) => Hashable (Rec r) where
  hashWithSalt :: Int -> Rec r -> Int
hashWithSalt Int
s Rec r
record = forall a. Hashable a => Int -> a -> Int
hashWithSalt Int
s (forall (c :: * -> Constraint) (ρ :: Row (*)) b.
Forall ρ c =>
(forall a. c a => a -> b) -> Rec ρ -> [b]
Rec.erase @Hashable (forall a. Hashable a => Int -> a -> Int
hashWithSalt Int
s) Rec r
record)