Repository: zyedidia/micro
File: internal/views/splits.go (Go)

Code before:

	if len(n.children) == 1 {
		// Replace current node with child node to remove chained parent
		n.parent.children[ind] = n.children[0]
		n.parent.children[ind].parent = n.parent
		if n.children[0].IsLeaf() {
			n.parent.children[ind].Kind = n.Kind
		} else {
			// Flatten the child node that replaced the current node
			n.parent.children[ind].flatten()
		}
	} else if !n.IsLeaf() && n.Kind == n.parent.Kind {
		// If we have the same kind as the parent (cuased by previous flattening),
		// replace this node with our children.
		origsize := len(n.parent.children)

		// Let's say we have 5 children and want to replace [2] with its children [a] [b] [c]
		// [0] [1] [2] [3] [4] --> [0] [1] [a] [b] [c] [3] [4]
		// insertcount will be `3 - 1 = 2` in this case
		insertcount := len(n.children) - 1
		n.parent.children = append(n.parent.children, make([]*Node, insertcount)...)
		if ind != origsize-1 {
			copy(n.parent.children[(ind+insertcount+1):], n.parent.children[(ind+1):origsize])
		}
		for i := 0; i < len(n.children); i++ {
			n.parent.children[ind+i] = n.children[i]
			n.parent.children[ind+i].parent = n.parent
		}
	}

	// Update propW and propH since the parent of the children might have been updated
	n.parent.markSizes()
}

// String returns the string form of the node and all children (used for debugging)
func (n *Node) String() string {
	var strf func(n *Node, ident int) string
	strf = func(n *Node, ident int) string {
		marker := "|"
		if n.Kind == STHoriz {
			marker = "-"
		}
		str := fmt.Sprint(strings.Repeat("\t", ident), marker, n.View, n.id)
		if n.IsLeaf() {
			str += "🍁"
		}
		str += "\n"
		for _, c := range n.children {
			str += strf(c, ident+1)
		}
		return str

Review comment (suggestion):
nit: maybe use `copy` instead (although it makes no functional difference), just to keep the same "style" as above?

And then in combination with my above 2 suggestions, we can beautify the code as follows:

```go
--- a/internal/views/splits.go
+++ b/internal/views/splits.go
@@ -513,12 +513,12 @@ func (n *Node) flatten() {
 		// [0] [1] [2] [3] [4] --> [0] [1] [a] [b] [c] [3] [4]
 		// insertcount will be `3 - 1 = 2` in this case
 		insertcount := len(n.children) - 1
+
 		n.parent.children = append(n.parent.children, make([]*Node, insertcount)...)
-		if ind != origsize-1 {
-			copy(n.parent.children[(ind+insertcount+1):], n.parent.children[(ind+1):origsize])
-		}
+		copy(n.parent.children[ind+insertcount+1:], n.parent.children[ind+1:origsize])
+		copy(n.parent.children[ind:], n.children)
+
 		for i := 0; i < len(n.children); i++ {
-			n.parent.children[ind+i] = n.children[i]
 			n.parent.children[ind+i].parent = n.parent
 		}
 	}
```

Code after:
	successor.parent = n.parent

	// Maintain the tree in a consistent state: any child node's kind (horiz vs vert)
	// should be the opposite of its parent's kind.
	if successor.IsLeaf() {
		successor.Kind = n.Kind
	} else {
		// If the successor node has children, that means it is a chained parent as well.
		// Therefore it can be replaced by its own children.
		origsize := len(n.parent.children)

		// Let's say we have 5 children and want to replace [2] with its children [a] [b] [c]
		// [0] [1] [2] [3] [4] --> [0] [1] [a] [b] [c] [3] [4]
		// insertcount will be `3 - 1 = 2` in this case
		insertcount := len(successor.children) - 1

		n.parent.children = append(n.parent.children, make([]*Node, insertcount)...)
		copy(n.parent.children[ind+insertcount+1:], n.parent.children[ind+1:origsize])
		copy(n.parent.children[ind:], successor.children)

		for i := 0; i < len(successor.children); i++ {
			n.parent.children[ind+i].parent = n.parent
		}
	}

	// Update propW and propH since the parent of the children has been updated,
	// so the children have new siblings
	n.parent.markSizes()
}

// String returns the string form of the node and all children (used for debugging)
func (n *Node) String() string {
	var strf func(n *Node, ident int) string
	strf = func(n *Node, ident int) string {
		marker := "|"
		if n.Kind == STHoriz {
			marker = "-"
		}
		str := fmt.Sprint(strings.Repeat("\t", ident), marker, n.View, n.id)
		if n.IsLeaf() {
			str += "🍁"
		}
		str += "\n"
		for _, c := range n.children {
			str += strf(c, ident+1)
		}
		return str
	}
	return strf(n, 0)
}