{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE UndecidableInstances #-} -- | -- Module : Datafix.IntArgsMonoSet -- Copyright : (c) Sebastian Graf 2017-2020 -- License : ISC -- Maintainer : sgraf1337@gmail.com -- Portability : portable -- -- Wraps an 'IntArgsMonoMap' into an 'IntArgsMonoSet'. module Datafix.IntArgsMonoSet where import Data.Maybe (isJust) import Datafix.IntArgsMonoMap (IntArgsMonoMap) import qualified Datafix.IntArgsMonoMap as Map import Datafix.MonoMap (MonoMap, MonoMapKey) import GHC.Exts (coerce) newtype IntArgsMonoSet k = Set (IntArgsMonoMap k ()) deriving instance Eq (MonoMap k ()) => Eq (IntArgsMonoSet k) deriving instance Show (MonoMap k ()) => Show (IntArgsMonoSet k) empty :: IntArgsMonoSet k empty = Set Map.empty singleton :: MonoMapKey k => Int -> k -> IntArgsMonoSet k singleton i k = Set (Map.singleton i k ()) insert :: MonoMapKey k => Int -> k -> IntArgsMonoSet k -> IntArgsMonoSet k insert i k = coerce (Map.insert i k ()) delete :: MonoMapKey k => Int -> k -> IntArgsMonoSet k -> IntArgsMonoSet k delete i k (Set m) = Set (Map.delete i k m) member :: MonoMapKey k => Int -> k -> IntArgsMonoSet k -> Bool member i k (Set m) = isJust (Map.lookup i k m) difference :: MonoMapKey k => IntArgsMonoSet k -> IntArgsMonoSet k -> IntArgsMonoSet k difference (Set a) (Set b) = Set (Map.difference a b) toList :: MonoMapKey k => IntArgsMonoSet k -> [(Int, k)] toList (Set m) = Map.keys m highestPriorityNodes :: MonoMapKey k => IntArgsMonoSet k -> [(Int, k)] highestPriorityNodes (Set m) = Map.highestPriorityNodes m