module Data.Reify.GADT.Graph (
    Unique,
    Node (..),
    Graph (..),
    Terminal (..),
) where

-- 'Label' for a node in the graph
type Unique = Int

data Node e = forall t. MkNode (e Terminal t)

instance (forall t. Show (e Terminal t)) => Show (Node e) where
    show :: Node e -> String
show (MkNode e Terminal t
e) = e Terminal t -> String
forall a. Show a => a -> String
show e Terminal t
e

data Graph e a = Graph [(Unique, Node e)] Unique

-- An AST node that refers to a Graph Node
newtype Terminal a = Terminal {forall a. Terminal a -> Int
unTerminal :: Unique}

instance Show (Terminal a) where
    show :: Terminal a -> String
show (Terminal Int
a) = String
"Terminal " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
a