> module Haskore.General.GraphTaggedGen where
> import qualified Haskore.General.TagDictionary as Dict
This is a generalization from \module{Haskore.General.LoopTreeTaggedGen}
to general graphs.
The addition to that module is ``sharing''.
It doesn't seem to be worthwile to put everything into a tree based structure.
Instead we maintain a dictionary of sharing branches,
where we split the signal either for feedback or for forward sharing.
The dictionary structure should be shared
with \module{Haskore.General.LoopTreeTagged}.
> type T tag coll = Dict.T tag (Tree tag coll)
> data Tree tag coll =
> Branch (coll (Tree tag coll))
> | Reference tag
>
Cf. \module{Haskore.General.LoopTreeTaggedGen}.
> class CollEq coll where
> collEqual :: Eq tag => coll (Tree tag coll) -> coll (Tree tag coll) -> Bool
> class CollShow coll where
> collShowsPrec :: Show tag => Int -> coll (Tree tag coll) -> ShowS
> instance (Eq tag, CollEq coll) => Eq (Tree tag coll) where
> Branch x0 == Branch x1 = collEqual x0 x1
> Reference i0 == Reference i1 = i0 == i1
> _ == _ = False
> instance (Show tag, CollShow coll) => Show (Tree tag coll) where
> showsPrec p branch = showParen (p>10)
> (case branch of
> Branch x -> showString "Branch " . collShowsPrec 11 x
> Reference i -> showString "Reference " . showsPrec 11 i)
> unwind :: (Ord tag, Functor coll) => T tag coll -> T tag coll
> unwind dict =
> let aux branch =
> case branch of
> Branch x -> Branch (fmap aux x)
> Reference tag -> Dict.lookup newDict tag
> newDict = fmap aux dict
> in newDict