import 'Tree.ecore'::tree;
import 'TallTree.ecore'::talltree;
import 'Tree2TallTree.ecore'::tree2talltree;

transformation Tree2TallTree {
	tree imports tree;
	talltree imports talltree;
	tree2talltree imports tree2talltree;

	entry __root__ check tree enforce talltree {
	    append nodes : tree::Node;
	    buffer node2tallNodes : tree2talltree::Node2TallNode;
	    install Node2MiddleNode {
	        node consumes nodes;
	        node2tallNodes appendsTo node2tallNodes;	
	    } 
	    install Edge2MiddleEdge {
	        node consumes nodes;
	    } 
	    install MiddleNode2TallNode {
	        node2tallNode consumes node2tallNodes;	
	    } 
	}
	
	map Node2MiddleNode {
		guard:tree node : Node; 
		append node2tallNodes : tree2talltree::Node2TallNode; 
		new:tree2talltree node2tallNode : Node2TallNode;
		set node2tallNode.node := node;
		set node2tallNode.name := node.name;
		add node2tallNodes += node2tallNode;
	}
	
	map Edge2MiddleEdge {
		guard:tree node : Node;
		var node2tallNode : Node2TallNode := node.Node2TallNode;
		check node.parent <> null;
		notify set node2tallNode.parent := node.parent.Node2TallNode;
	--		node2tallNode.name := node.name;
	}
	
	map MiddleNode2TallNode {
		guard:tree2talltree node2tallNode : Node2TallNode;
		var tallNode_name : String := node2tallNode.name;
		observe Node2TallNode::children, Node2TallNode::tallNode
		var tallNode_children : Set(TallNode) := node2tallNode.children?.tallNode->asSet();
		observe Node2TallNode::children, Node2TallNode::tallNode, TallNode::height
		var tallNode_height : Integer := if node2tallNode.children->notEmpty() then node2tallNode.children.tallNode.height->max() + 1 else 0 endif;
		new:talltree tallNode : TallNode;
		notify set node2tallNode.tallNode := tallNode;
		set	tallNode.name := tallNode_name;
		set	tallNode.children := tallNode_children;
		notify set tallNode.height := tallNode_height;
	}
}
