minesweeper-0.9: Data/ChangeMap.hs
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