{----------------------------------------------------------------------------

	Transformation und Faltung von allgemeinen Baeumen (Rose Trees)

----------------------------------------------------------------------------}

data Rose a = Node a [Rose a]
		deriving Show
		
-- map und fold 
mapRose :: (a -> b) -> Rose a -> Rose b
mapRose f (Node x ts) 
	=  Node (f x) (map (mapRose f) ts)
	
foldRose :: (a -> [b] -> b) -> Rose a -> b
foldRose f (Node x ts)
	 =  f x (map (foldRose f) ts)
	 

-- einfache Anwendungen

-- Aufsummieren aller Baumeintraege
sumRose :: Num a => Rose a -> a
sumRose = foldRose (flip ((+).sum))

-- Bestimmung der Knotenzahl
sizeRose :: Rose a -> Int
sizeRose =  foldRose (\ _ ns -> 1 + sum ns)

-- mapRose als Instanz von foldRose
mapRose'   :: (a -> b) -> Rose a -> Rose b
mapRose' f =  foldRose (Node . f)


-- Beispielbaum
baum = Node 1 [ Node 2 [], 
		Node 3 [Node 6 [], 
			Node 7 [], 
			Node 8 []
			],
		Node 4 [], 
		Node 5 []
		]


