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))
-}