module Language.Astview.DataTree where

-- syb
import Data.Generics (Data
                     ,extQ
                     ,gmapQ
                     ,showConstr
                     ,toConstr)

-- containers
import Data.Tree (Tree(Node,rootLabel))

-- | Trealise Data to Tree (from SYB 2, sec. 3.4 )
data2tree :: Data a => a -> Tree String
data2tree = gdefault `extQ` atString
  where 
    atString x = Node x []
    gdefault x = Node (showConstr $ toConstr x) (gmapQ data2tree x) 
    
flat :: Tree String -> Tree String
flat = id -- do nothing, see commentary below





{- -- try to flatten degenerated trees (lists of cons)


flat (Node a xs) = Node a xs --(flat <$> (children False =<< xs))    

-- use a boolean marker to notice whether we are inside a list (True) 
-- or should start a new list, then recurse
children :: Bool -> Tree String -> [Tree String]
children False (Node "(:)" [left,right])        = [Node ("ListOf"++(rootLabel left)) (left:(children True right)) ]
children True  (Node "(:)" [left,Node "[]" []]) = [left]
children True  (Node "(:)" [left,right])        = left:(children True right)
children _ (Node a xs) 
 | null xs  =  [Node a []]
 |otherwise =  [Node a xs]
children x y = error ("No pattern match for children " ++ show x ++ " " ++ (drawTree y))
-}