packages feed

minesweeper-0.9: Data/ChangeSet.hs

{-# LANGUAGE NoMonomorphismRestriction #-}

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

import qualified Data.Set as S

import Data.Binary
import Data.Data

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

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

forget (ChangeSet m _) = ChangeSet m []

fromSet s = ChangeSet s (S.toList s)

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

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

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


size        = S.size . toSet

member k    = S.member k . toSet

notMember k = S.notMember k . toSet

toList      = S.toList . toSet


empty       = fromSet $ S.empty

fromList    = fromSet . S.fromList

fromDistinctAscList = fromSet . S.fromDistinctAscList


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


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