-- 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. -- -- '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.1 -- | Custom Ty & Typable module CustomTy -- | Typed type representation. Alternative to Data.Ty in the ty package data Ty a Bool :: Ty Bool Integer :: Ty Integer Float :: Ty Float (:*:) :: Ty a -> Ty b -> Ty (a, b) (:->:) :: Ty a -> Ty b -> Ty (a -> b) -- | Replacement for Typeable and the ty package's ty. class Typeable a ty :: Typeable a => Ty a instance (Typeable a, Typeable b) => Typeable (a -> b) instance (Typeable a, Typeable b) => Typeable (a, b) instance Typeable Float instance Typeable Integer instance Typeable Bool instance IsTy Ty 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) module Exp data Op :: * -> * Add :: Op (a -> a -> a) Mul :: Op (a -> a -> a) Lit :: a -> Op a data E :: (* -> *) -> * -> * Op :: Op a -> E v a (:^) :: E v (a -> b) -> E v a -> E v b Let :: v a -> E v a -> E v b -> E v b Var :: v a -> E v a data N :: (* -> *) -> * -> * ON :: Op a -> N v a App :: v (a -> b) -> v a -> N v b parens :: String -> String notSupp :: String -> a nodeE :: N v a -> E v a unGraph :: Typeable a => Graph Ty N a -> E (V Ty) a ssa :: Typeable a => E (V Ty) a -> IO (E (V Ty) a) children :: N (V Ty) a -> [Id] childrenB :: Bind Ty N -> [Id] uses :: [Bind Ty N] -> (Id -> Int) histogram :: [Int] -> IntMap Int bindsF' :: [Bind Ty N] -> (V Ty a -> N (V Ty) a) bindsF :: [Bind Ty n] -> (V Ty a -> n (V Ty) a) unGraph2 :: Graph Ty N a -> E (V Ty) a -- | Common subexpression elimination cse :: Typeable a => E (V Ty) a -> IO (E (V Ty) a) op2 :: (Typeable a, Typeable b, Typeable c) => Op (a -> b -> c) -> E v a -> E v b -> E v c sqr :: Num a => a -> a reify :: (MuRef Ty h, Typeable a) => h a -> IO (Graph Ty (DeRef h) a) test :: Int -> E (V Ty) Integer instance (Typeable a, Num a) => Num (E (V Ty) a) instance Eq (E v a) instance MuRef Ty (E v) instance Show (E (V Ty) a) instance ShowF v => ShowF (N v) instance Show (Op a) instance ShowF Op