{-# LANGUAGE Safe, MultiParamTypeClasses, FlexibleInstances #-} {- | Module : SDP.HashSet Copyright : (c) Andrey Mulik 2020 License : BSD-style Maintainer : work.a.mulik@gmail.com Portability : portable @SDP.HashSet@ provides 'HashSet' - unordered set with 'Hashable' keys. -} module SDP.HashSet ( -- * Exports module SDP.Hashable, module SDP.Linear, module SDP.Set, -- * Hash set HashSet ) where import Prelude () import SDP.SafePrelude import SDP.Hashable import SDP.Linear import SDP.Set import qualified Data.HashSet as H import Data.HashSet ( HashSet ) default () -------------------------------------------------------------------------------- {- Nullable, Estimate and Bordered instances. -} instance Nullable (HashSet e) where isNull = null lzero = H.empty instance Estimate (HashSet e) where (<==>) = on (<=>) sizeOf (.<=.) = on (<=) sizeOf (.>=.) = on (>=) sizeOf (.>.) = on (>) sizeOf (.<.) = on (<) sizeOf (<.=>) = (<=>) . sizeOf (.>=) = (>=) . sizeOf (.<=) = (<=) . sizeOf (.>) = (>) . sizeOf (.<) = (<) . sizeOf instance Bordered (HashSet e) Int where sizeOf = length upper xs = length xs - 1 lower _ = 0 -------------------------------------------------------------------------------- instance (Eq e, Hashable e) => Set (HashSet e) e where set = id -- always correct member = H.member insert = H.insert delete = H.delete unions = foldr1 (\/) symdiffs = foldr1 (\^/) differences = foldr1 (/\) intersections = foldr1 (\\) (/\) = H.intersection (\\) = H.difference (\/) = H.union xs \^/ ys = (xs \/ ys) \\ (xs /\ ys) xs \+/ ys = isNull (ys \\ xs) xs /?\ ys = isNull (xs /\ ys) xs \?/ ys = not (xs /?\ ys) lookupLT e = lookupLT e . H.toList lookupGT e = lookupGT e . H.toList lookupLE e = lookupLE e . H.toList lookupGE e = lookupGE e . H.toList