packages feed

minesweeper-0.8.8: Data/ChangeSet.hs

module Data.ChangeSet
    ( Set
    , changes
    , forget
    , insert
    , delete
    , size
    , empty
    , member
    , notMember
    , fromList
    , fromDistinctAscList
    , toList
    , (\\)
    ) where

import qualified Data.Set as M

import Data.Binary
{-
import Control.Monad
import Data.DeriveTH
import Data.Derive.Binary
-}
------------------------------

data Set k = ChangeSet
    { toSet   :: M.Set k 
    , changes :: [k]
    }
 deriving (Show, Read)

forget (ChangeSet m _) = ChangeSet m []

fromSet s = ChangeSet s (M.toList s)

----------------------

insert k (ChangeSet m c) = ChangeSet (M.insert k m) (k: c)

delete k (ChangeSet m c) = ChangeSet (M.delete k m) (k: c)


size = M.size . toSet

member k = M.member k . toSet

notMember k = M.notMember k . toSet

toList = M.toList . toSet


empty = fromSet $ M.empty

fromList = fromSet . M.fromList

fromDistinctAscList = fromSet . M.fromDistinctAscList


a \\ b = fromSet (toSet a M.\\ toSet b)


instance (Ord k, Binary k) => Binary (Set k) where
    put = put . toSet
    get = fmap fromSet get


-- $( derive makeBinary ''Set )