packages feed

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