> 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