{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
module Util.KeyedChanges(
KeyedChanges,
newKeyedChanges,
sendKeyedChanges,
deleteKeyedChange,
) where
import qualified Data.Map as Map
import Util.Sources
import Util.Broadcaster
newtype KeyedChanges key delta
= KeyedChanges (Broadcaster (Map.Map key delta) delta)
newKeyedChanges :: Ord key => IO (KeyedChanges key delta)
newKeyedChanges =
do
broadcaster <- newBroadcaster Map.empty
return (KeyedChanges broadcaster)
sendKeyedChanges :: Ord key => key -> delta -> KeyedChanges key delta -> IO ()
sendKeyedChanges key delta (KeyedChanges broadcaster) =
applyUpdate broadcaster (\ map -> (Map.insert key delta map,[delta]))
deleteKeyedChange :: Ord key => key -> delta -> KeyedChanges key delta -> IO ()
deleteKeyedChange key delta (KeyedChanges broadcaster) =
applyUpdate broadcaster (\ map -> case Map.lookup key map of
Nothing -> (map,[])
Just _ -> (Map.delete key map,[delta])
)
instance Ord key => HasSource (KeyedChanges key delta) [delta] delta where
toSource (KeyedChanges broadcaster) = map1 Map.elems (toSource broadcaster)