package layoutgraph

import 

type Tree struct {
	Node         *Node
	Parent       *Tree
	Children     []*Tree
	SentinelEdge *Edge
	Orientation  geo.Orientation
}

type Trees []*Tree

func ( *Node) *Tree {
	 := new(Tree)
	.Node = 
	.Children = make([]*Tree, 0)
	return 
}

func ( *Tree) ( map[*Edge]bool) {
	if .Parent != nil && .SentinelEdge != nil {
		[.SentinelEdge] = true
	}
	for ,  := range .Children {
		.()
	}
}

func ( *Graph) () map[*Edge]bool {
	// Note: this only includes internal tree edges. It doesn't include the edge between the tree root and the rootSentinel
	 := make(map[*Edge]bool)
	for ,  := range .TreeOrder() {
		for ,  := range .Trees[] {
			.recordInternalTreeEdges()
		}
	}
	return 
}

func ( *Graph) ( *Node) bool {
	if .isContainer {
		return false
	}
	// it is an isolated tree if all edges are to trees
	for ,  := range .Edges {
		 := false
		for ,  := range .Trees[] {
			if  == .SentinelEdge {
				 = true
				break
			}
		}
		if ! {
			return false
		}
	}
	return true
}

func ( *Graph) ( map[*Edge]bool) {
	for ,  := range .TreeOrder() {
		if .isIsolatedTree() {
			for ,  := range .Trees[] {
				if .SentinelEdge != nil {
					[.SentinelEdge] = true
				}
			}
		}
	}
}

// tree is either the source or target of its sentinel edge, return true if it is the source
func ( *Tree) () bool {
	return .SentinelEdge.From == .Node
}

// return the node this tree is connected to via its sentinel edge
func ( *Tree) () *Node {
	if .isSentinelEdgeSource() {
		return .SentinelEdge.To
	}
	return .SentinelEdge.From
}

func ( *Tree) () *Tree {
	if .Parent == nil {
		return 
	}
	return .Parent.()
}