lumi

Форк
0
/
ref.go 
66 строк · 1.2 Кб
1
package lumi
2

3
import (
4
	"fmt"
5
	kelo "gitverse.ru/metalcore/kelo"
6
	"gitverse.ru/metalcore/lumi/base"
7
)
8

9
type Ref[T any] struct {
10
	nodes map[kelo.NodeValuer]kelo.NodeValuer
11
	value T
12
	bonds []base.Updater
13
}
14

15
func NewRef[T any](value T) *Ref[T] {
16
	return &Ref[T]{
17
		nodes: make(map[kelo.NodeValuer]kelo.NodeValuer),
18
		value: value,
19
	}
20
}
21

22
func (r *Ref[T]) Get() T {
23
	return r.value
24
}
25

26
func (r *Ref[T]) Set(value T) {
27
	r.value = value
28
	if len(r.nodes) > 0 {
29
		for _, node := range r.nodes {
30
			node.SetNodeValue(r.String())
31
		}
32
	}
33
	for _, bond := range r.bonds {
34
		bond.Update()
35
	}
36
}
37

38
func (r *Ref[T]) Stick(updater base.Updater) {
39
	for _, bond := range r.bonds {
40
		if bond == updater {
41
			return
42
		}
43
	}
44
	r.bonds = append(r.bonds, updater)
45
}
46

47
func (r *Ref[T]) UnStick(updater base.Updater) {
48
	for i, bond := range r.bonds {
49
		if bond != updater {
50
			continue
51
		}
52
		r.bonds = append(r.bonds[:i], r.bonds[i+1:]...)
53
		return
54
	}
55
}
56

57
func (r *Ref[T]) String() string {
58
	return fmt.Sprintf("%v", r.value)
59
}
60

61
func (r *Ref[T]) Render(parent kelo.NodeValuer) kelo.NodeValuer {
62
	if _, ok := r.nodes[parent]; !ok {
63
		r.nodes[parent] = kelo.GetDocument().CreateTextNode(r.String())
64
	}
65
	return r.nodes[parent]
66
}
67

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.