module Manatee.Toolkit.Data.SetList where
import Data.Set (Set)
import Manatee.Toolkit.General.Set
import qualified Data.Set as Set
data Ord a => SetList a =
SetList {listCounter :: Int
,listSet :: Set a}
setListNew :: Ord a => SetList a
setListNew = SetList 0 Set.empty
setListGetCounter :: Ord a => SetList a -> Int
setListGetCounter = listCounter
setListGetNewCounter :: Ord a => SetList a -> (Int, SetList a)
setListGetNewCounter sl = (newId, newSetList)
where newSetList = setListIncCounter sl
newId = setListGetCounter newSetList
setListSetCounter :: Ord a => SetList a -> Int -> SetList a
setListSetCounter sl c = sl {listCounter = c}
setListIncCounter :: Ord a => SetList a -> SetList a
setListIncCounter sl@(SetList {listCounter = c}) = sl {listCounter = succ c}
setListAddNode :: Ord a => SetList a -> a -> SetList a
setListAddNode sl@(SetList {listSet = s}) e = sl {listSet = Set.insert e s}
setListRemoveNode :: Ord a => SetList a -> a -> SetList a
setListRemoveNode sl@(SetList {listSet = s}) e = sl {listSet = Set.delete e s}
setListRemoveOthersNode :: Ord a => SetList a -> a -> SetList a
setListRemoveOthersNode sl = setListAddNode (setListEmptySet sl)
setListGetNode :: Ord a => SetList a -> (a -> Bool) -> Maybe a
setListGetNode = maybeFindMin . listSet
setListGetNodeM :: (Ord a, Monad m) => SetList a -> (a -> m Bool) -> m (Maybe a)
setListGetNodeM = maybeFindMinM . listSet
setListEmptySet :: Ord a => SetList a -> SetList a
setListEmptySet sl = sl {listSet = Set.empty}
setListGetList :: Ord a => SetList a -> [a]
setListGetList (SetList {listSet = s}) = Set.toList s