packages feed

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