module STMContainers.Set
(
Set,
Element,
new,
insert,
delete,
lookup,
foldM,
null,
)
where
import STMContainers.Prelude hiding (insert, delete, lookup, alter, foldM, toList, empty, null)
import qualified STMContainers.HAMT as HAMT
import qualified STMContainers.HAMT.Nodes as HAMTNodes
import qualified Focus
newtype Set e = Set {hamt :: HAMT.HAMT (HAMTElement e)}
type Element a = (Eq a, Hashable a)
newtype HAMTElement e = HAMTElement e
instance (Eq e) => HAMTNodes.Element (HAMTElement e) where
type ElementKey (HAMTElement e) = e
elementKey (HAMTElement e) = e
elementValue :: HAMTElement e -> e
elementValue (HAMTElement e) = e
insert :: (Element e) => e -> Set e -> STM ()
insert e = HAMT.insert (HAMTElement e) . hamt
delete :: (Element e) => e -> Set e -> STM ()
delete e = HAMT.focus Focus.deleteM e . hamt
lookup :: (Element e) => e -> Set e -> STM Bool
lookup e = fmap (maybe False (const True)) . HAMT.focus Focus.lookupM e . hamt
foldM :: (a -> e -> STM a) -> a -> Set e -> STM a
foldM f a = HAMT.foldM (\a -> f a . elementValue) a . hamt
new :: STM (Set e)
new = Set <$> HAMT.new
null :: Set e -> STM Bool
null = HAMT.null . hamt