> 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    {- continue at one root of the dictionary,
>                          this can mean feedback or sharing -}
> --       deriving (Eq, Show)
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