lipgloss/tree/children.go
Maas Lalani 1afeca0d80
Tree API Changes (#307)
* refactor: clean tree_test.go

* refactor: remove subtests

* refactor: rename `Data` to `Items` for `Lists` and `Children` for `Trees`

* chore: support only NodeData

* fix: enumerations -> enumerators for consistency

* fix: item -> children

* fix: use l for List, rather than n

* fix: move list Enumerator definition to enumerator.go

* fix: list enumerator comments

* docs: add package documentation

* fix: examples

* feat: split enumerator and indenters

* docs: add comments

* refactor: package comment

* docs: use more tree terminology

* docs: refactor indentor comments

* fix: lint
2024-05-30 17:11:28 -04:00

99 lines
2.2 KiB
Go

package tree
// Children is the interface that wraps the basic methods of a list model.
type Children interface {
// At returns the content item of the given index.
At(index int) Node
// Length returns the number of items in the list.
Length() int
}
// NodeChildren is the implementation of the Children interface with tree Nodes.
type NodeChildren []Node
// Append appends a child to the list of children.
func (n NodeChildren) Append(child Node) NodeChildren {
n = append(n, child)
return n
}
// Remove removes a child from the list at the given index.
func (n NodeChildren) Remove(index int) NodeChildren {
if index < 0 || len(n) < index+1 {
return n
}
n = append(n[:index], n[index+1:]...)
return n
}
// Length returns the number of children in the list.
func (n NodeChildren) Length() int {
return len(n)
}
// At returns the child at the given index.
func (n NodeChildren) At(i int) Node {
if i >= 0 && i < len(n) {
return n[i]
}
return nil
}
// NewStringData returns a Data of strings.
func NewStringData(data ...string) Children {
result := make([]Node, 0, len(data))
for _, d := range data {
s := Leaf{value: d}
result = append(result, &s)
}
return NodeChildren(result)
}
var _ Children = NewFilter(nil)
// Filter applies a filter on some data. You could use this to create a new
// tree whose values all satisfy the condition provided in the Filter() function.
type Filter struct {
data Children
filter func(index int) bool
}
// NewFilter initializes a new Filter.
func NewFilter(data Children) *Filter {
return &Filter{data: data}
}
// At returns the item at the given index.
// The index is relative to the filtered results.
func (m *Filter) At(index int) Node {
j := 0
for i := 0; i < m.data.Length(); i++ {
if m.filter(i) {
if j == index {
return m.data.At(i)
}
j++
}
}
return nil
}
// Filter uses a filter function to set a condition that all the data must satisfy to be in the Tree.
func (m *Filter) Filter(f func(index int) bool) *Filter {
m.filter = f
return m
}
// Length returns the number of items in the list.
func (m *Filter) Length() int {
j := 0
for i := 0; i < m.data.Length(); i++ {
if m.filter(i) {
j++
}
}
return j
}