{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Pier.Core.HashableSet
    ( HashableSet(..)
    ) where

import qualified Data.Set as Set
import Development.Shake.Classes

-- | A newtype wrapper for 'Data.Set' which is an instance of 'Hashable',
-- so it can be used in Shake rules.
newtype HashableSet a = HashableSet { unHashableSet :: Set.Set a }
    deriving (Eq, Binary, NFData, Semigroup, Monoid)

instance Hashable a => Hashable (HashableSet a) where
    hashWithSalt k = hashWithSalt k . Set.toList . unHashableSet