module Data.ChangeMap ( Map , changes , forget , insert , delete , lookup , size , empty , keys , member , notMember , alter , fromList , toList , null , adjust ) where import qualified Data.Map as M import Prelude hiding (lookup, null) import Data.Binary import Data.Data -------------------- data Ord k => Map k a = ChangeMap { toMap :: M.Map k a , changes :: [k] } deriving (Show, Read, Typeable, Data) forget (ChangeMap m _) = ChangeMap m [] fromMap m = ChangeMap m (M.keys m) --------------------------- insert k a (ChangeMap m c) = ChangeMap (M.insert k a m) (k: c) delete k (ChangeMap m c) = ChangeMap (M.delete k m) (k: c) alter f k (ChangeMap m c) = ChangeMap (M.alter f k m) (k: c) adjust f k (ChangeMap m c) = ChangeMap (M.adjust f k m) (k: c) lookup k = M.lookup k . toMap member k = M.member k . toMap notMember k = M.notMember k . toMap size = M.size . toMap keys = M.keys . toMap null = M.null . toMap empty = fromMap M.empty fromList = fromMap . M.fromList toList = M.toList . toMap instance (Ord k, Binary k, Binary a) => Binary (Map k a) where put = put . toMap get = fmap fromMap get