module Dynforkmerge(DynMsg(..), DynSPMsg(..), dynforkmerge) where
import SP
import Utils(part)
data DynMsg a b = DynCreate b |
DynDestroy |
DynMsg a
deriving (Eq, Ord)
type DynSPMsg a b = DynMsg a (SP a b)
dynforkmerge :: Eq a => SP (a, DynSPMsg b c) (a, c)
dynforkmerge = dfm []
dfm dynxsps =
GetSP (\msg ->
case msg of
(t, DynCreate dynsp) -> dfmout t dynsp dynxsps
(t, DynMsg msg') -> dfmin t msg' dynxsps
(t, DynDestroy) -> dfmrm t dynxsps)
dfmout t dynsp dynxsps =
case dynsp of
PutSP y sp' -> PutSP (t, y) (dfmout t sp' dynxsps)
GetSP xsp -> dfm ((t, xsp) : dynxsps)
NullSP -> dfm dynxsps
dfmin t msg dynxsps =
case part ((== t) . fst) dynxsps of
([], _) -> dfm dynxsps
([(_, xsp)], dynxsps') -> dfmout t (xsp msg) dynxsps'
_ -> error "Same tag used twice in dynforkmerge (or dynListF)."
dfmrm t dynxsps = dfm (filter ((t /=) . fst) dynxsps)