-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | Reify a recursive data structure into an explicit graph.
--
-- This package is a (probably temporary) fork of Andy gill's data-reify
-- package. I've tweaked it for typed syntax representations for use with
-- GADTs.
--
-- 'data-reify' provided the ability to turn recursive structures into
-- explicit graphs. Many (implicitly or explicitly) recursive data
-- structure can be given this ability, via a type class instance. This
-- gives an alternative to using Ref for observable sharing.
--
-- Observable sharing in general is unsafe, so we use the IO monad to
-- bound this effect, but can be used safely even with
-- unsafePerformIO if some simple conditions are met. Typically
-- this package will be used to tie the knot with DSL's that depend of
-- observable sharing, like Lava.
--
-- Providing an instance for MuRef is the mechanism for allowing a
-- structure to be reified into a graph, and several examples of this are
-- provided.
--
-- Version 0.2 of 'data-reify' uses StableNames, and is much
-- faster. Version 0.3 provided two versions of MuRef, the
-- mono-typed version, for trees of a single type, and the dynamic-typed
-- version, for trees of different types.
--
-- © 2009 Andy Gill; BSD3 license.
@package data-treify
@version 0.3.2
module Data.Reify.TGraph
class ShowF f
showF :: ShowF f => f a -> String
-- | Identifiers
type Id = Int
-- | Typed variables
data V ty a
V :: Id -> (ty a) -> V ty a
-- | Typed binding pair, parameterized by variable and node type
-- constructors.
data Bind ty n
Bind :: (V ty a) -> (n (V ty) a) -> Bind ty n
-- | Graph, described by bindings and a root variable
data Graph ty n a
Graph :: [Bind ty n] -> (V ty a) -> Graph ty n a
instance (ShowF (n (V ty)), Show (V ty a)) => Show (Graph ty n a)
instance ShowF (n (V ty)) => Show (Bind ty n)
instance Show (V ty a)
instance ShowF (V ty)
instance Eq (V ty a)
module Data.TReify
class MuRef ty h where type family DeRef h :: (* -> *) -> * -> *
mapDeRef :: (MuRef ty h, Applicative m) => (forall a. ty a -> h a -> m (v a)) -> (forall a. ty a -> h a -> m (DeRef h v a))
-- | reifyGraph takes a data structure that admits MuRef, and
-- returns a Graph that contains the dereferenced nodes, with
-- their children as Integer rather than recursive values.
reifyGraph :: (IsTy ty, MuRef ty h) => ty a -> h a -> IO (Graph ty (DeRef h) a)