import Data.Graph.Inductive

-- induktivni grafy
-- uvnitr resene pomoci diffarray/stromu/...

gr::Gr () ()
gr = ([((),4),((),6)], 1, (), [((),2), ((),5)]) 
     & (([((),4)], 2, (), [((),3)])
     & (([], 3, (), [((),4)])
     & (([((),5)], 4, (), [])
     & (([((),6)], 5, (), [])
     & (([], 6, (), []) 
     & empty)))))
data Tree a = N a [Tree a] deriving (Show)

dfs g q = snd (dfsR g q)

dfsR::Gr () () -> [Node] -> (Gr () (), [Tree Node])
dfsR g [] = (g, [])
dfsR g (h:t) =
  case match h g of
    (Nothing, g') -> dfsR g' t
    (Just (_,_,_,s), g') ->
       let (g'', s') = dfsR g' (map snd s)
           (g''', t') = dfsR g'' t
        in (g''', N h s' : t')

