treerack/node.go

96 lines
1.5 KiB
Go
Raw Normal View History

2017-07-15 21:49:08 +02:00
package treerack
2017-06-25 17:51:08 +02:00
import "fmt"
type Node struct {
Name string
2017-07-15 21:49:08 +02:00
id int
2017-06-25 17:51:08 +02:00
Nodes []*Node
2017-06-26 01:21:46 +02:00
From, To int
2017-06-25 17:51:08 +02:00
commitType CommitType
tokens []rune
}
2017-11-01 00:19:29 +01:00
func mapNodes(m func(n *Node) *Node, n []*Node) []*Node {
var nn []*Node
for i := range n {
nn = append(nn, m(n[i]))
}
return nn
}
func filterNodes(f func(n *Node) bool, n []*Node) []*Node {
var nn []*Node
for i := range n {
if f(n[i]) {
nn = append(nn, n[i])
}
}
return nn
}
2017-07-15 21:49:08 +02:00
func newNode(name string, id int, from, to int, ct CommitType) *Node {
2017-06-25 17:51:08 +02:00
return &Node{
Name: name,
2017-07-15 21:49:08 +02:00
id: id,
2017-06-26 01:21:46 +02:00
From: from,
To: to,
2017-06-25 17:51:08 +02:00
commitType: ct,
}
}
func (n *Node) tokenLength() int {
2017-06-26 01:21:46 +02:00
return n.To - n.From
2017-06-25 17:51:08 +02:00
}
func (n *Node) nodeLength() int {
return len(n.Nodes)
}
2017-07-17 01:41:38 +02:00
func (n *Node) appendChar(to int) {
if n.tokenLength() == 0 {
n.From = to - 1
}
n.To = to
}
2017-06-25 17:51:08 +02:00
func (n *Node) append(p *Node) {
n.Nodes = append(n.Nodes, p)
2017-06-26 01:21:46 +02:00
if n.tokenLength() == 0 {
n.From = p.From
2017-06-25 17:51:08 +02:00
}
2017-06-26 01:21:46 +02:00
n.To = p.To
2017-06-25 17:51:08 +02:00
}
2017-06-26 01:21:46 +02:00
func (n *Node) commit(t []rune) {
2017-06-25 17:51:08 +02:00
n.tokens = t
var nodes []*Node
for _, ni := range n.Nodes {
2017-06-26 01:21:46 +02:00
ni.commit(t)
2017-06-25 17:51:08 +02:00
if ni.commitType&Alias != 0 {
nodes = append(nodes, ni.Nodes...)
} else {
nodes = append(nodes, ni)
}
}
n.Nodes = nodes
}
func (n *Node) String() string {
2017-06-26 01:21:46 +02:00
if n.From >= len(n.tokens) || n.To > len(n.tokens) {
2017-10-28 16:54:06 +02:00
return n.Name + ":invalid"
2017-06-25 17:51:08 +02:00
}
2017-06-26 01:21:46 +02:00
return fmt.Sprintf("%s:%d:%d:%s", n.Name, n.From, n.To, n.Text())
2017-06-25 17:51:08 +02:00
}
func (n *Node) Text() string {
2017-06-26 01:21:46 +02:00
return string(n.tokens[n.From:n.To])
2017-06-25 17:51:08 +02:00
}