minesweeper-0.8.8: Data/ChangeMap.hs
{-# LANGUAGE NoMonomorphismRestriction, TemplateHaskell #-}
module Data.ChangeMap
( Map
, changes
, forget
, insert
, delete
, lookup
, size
, empty
, keys
, member
, notMember
, alter
, fromList
, null
, adjust
) where
import qualified Data.Map as M
import Prelude hiding (lookup, null)
import Data.Binary
{-
import Control.Monad
import Data.DeriveTH
import Data.Derive.Binary
--import Data.Binary
import Generics.MultiRec.Base
import Generics.MultiRec.Binary
-}
--------------------
data Ord k => Map k a = ChangeMap
{ toMap :: M.Map k a
, changes :: [k]
}
deriving (Show, Read)
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
-- $( derive makeBinary ''Map )
instance (Ord k, Binary k, Binary a) => Binary (Map k a) where
put = put . toMap
get = fmap fromMap get
-- put = gput undefined
-- get = gget undefined