Skip to content
Snippets Groups Projects
Select Git revision
  • 489c46edd60b0989bea1659f5edb97c36b70d310
  • master default protected
  • 0.8.2
  • 0.8.1
  • 0.8.0
  • 0.7.13
  • 0.7.12
  • 0.7.11
  • 0.7.10
  • 0.7.9
  • 0.7.8
  • 0.7.7
  • 0.7.6
  • 0.7.5
  • 0.7.4
  • 0.7.3
  • 0.7.2
  • 0.7.1
  • 0.7.0
  • 0.6.27
  • 0.6.26
  • 0.6.25
22 results

commandline.go

Blame
  • tree.go 2.25 KiB
    // Copyright 2023 schukai GmbH
    // SPDX-License-Identifier: AGPL-3.0
    
    package document
    
    import "fmt"
    
    type Tree[T any] struct {
    	Level    int
    	Children []*Tree[T]
    	Parent   *Tree[T]
    	Payload  T
    }
    
    func newTree[T any]() *Tree[T] {
    	return &Tree[T]{}
    }
    
    func (t *Tree[T]) traverseAndInitLevel(level int) {
    	t.Level = level
    	for _, child := range t.Children {
    		child.traverseAndInitLevel(level + 1)
    	}
    
    }
    
    func (t *Tree[T]) addChild(child *Tree[T]) {
    	t.Children = append(t.Children, child)
    	child.Parent = t
    
    	t.getRoot().traverseAndInitLevel(0)
    
    }
    
    func (t *Tree[T]) addChildren(children []*Tree[T]) {
    	for _, child := range children {
    		t.addChild(child)
    		child.Parent = t
    	}
    	t.getRoot().traverseAndInitLevel(0)
    }
    
    func (t *Tree[T]) getChildren() []*Tree[T] {
    	return t.Children
    }
    
    func (t *Tree[T]) getLevel() int {
    	return t.Level
    }
    
    func (t *Tree[T]) getParent() *Tree[T] {
    	return t.Parent
    }
    
    func (t *Tree[T]) getRoot() *Tree[T] {
    	if t.Parent == nil {
    		return t
    	}
    	return t.Parent.getRoot()
    }
    
    func (t *Tree[T]) getPayload() T {
    	return t.Payload
    }
    
    func (t *Tree[T]) setPayload(payload T) {
    	t.Payload = payload
    }
    
    func (t *Tree[T]) getPayloadAsString() string {
    	return fmt.Sprintf("%v", t.Payload)
    }
    
    func (t *Tree[T]) appendAndGet() *Tree[T] {
    	parent := t.getParent()
    
    	if parent == nil {
    		parent = t
    	}
    
    	n := newTree[T]()
    	parent.addChild(n)
    	return n
    }
    
    func (t *Tree[T]) up(level int) *Tree[T] {
    
    	if level > t.getLevel() {
    		panic("level>t.getLevel()")
    	}
    
    	if level == t.getLevel() {
    		return t
    	}
    
    	return t.Parent.up(level)
    
    }
    
    func (t *Tree[T]) recursiveIterate(f func(*Tree[T])) {
    	f(t)
    	for _, child := range t.Children {
    		child.recursiveIterate(f)
    	}
    }
    
    func (t *Tree[T]) down(level int) *Tree[T] {
    
    	if level < t.Level {
    		panic("level < t.Level")
    	}
    
    	if t.Level == level {
    		return t
    	}
    
    	if t.Children == nil {
    		t.addChild(newTree[T]())
    		return t.down(level)
    	}
    
    	return t.Children[len(t.Children)-1].down(level)
    }
    
    //func (t *Tree[T]) getSubTree() []Tree {
    //	return t.getSubTreeWithLevel(t.Level)
    //}
    //
    //func (t *Tree[T]) getSubTreeWithLevel(level int) []Tree {
    //	if t.Level == level {
    //		return []Tree{*t}
    //	}
    //	var result []Tree
    //	for _, child := range t.Children {
    //		result = append(result, child.getSubTreeWithLevel(level)...)
    //	}
    //	return result
    //}