module Data.ChangeSet ( Set , changes , forget , insert , delete , size , empty , member , notMember , fromList , fromDistinctAscList , toList , (\\) ) where import qualified Data.Set as M import Data.Binary {- import Control.Monad import Data.DeriveTH import Data.Derive.Binary -} ------------------------------ data Set k = ChangeSet { toSet :: M.Set k , changes :: [k] } deriving (Show, Read) forget (ChangeSet m _) = ChangeSet m [] fromSet s = ChangeSet s (M.toList s) ---------------------- insert k (ChangeSet m c) = ChangeSet (M.insert k m) (k: c) delete k (ChangeSet m c) = ChangeSet (M.delete k m) (k: c) size = M.size . toSet member k = M.member k . toSet notMember k = M.notMember k . toSet toList = M.toList . toSet empty = fromSet $ M.empty fromList = fromSet . M.fromList fromDistinctAscList = fromSet . M.fromDistinctAscList a \\ b = fromSet (toSet a M.\\ toSet b) instance (Ord k, Binary k) => Binary (Set k) where put = put . toSet get = fmap fromSet get -- $( derive makeBinary ''Set )