lumi
/
ref.go
66 строк · 1.2 Кб
1package lumi
2
3import (
4"fmt"
5kelo "gitverse.ru/metalcore/kelo"
6"gitverse.ru/metalcore/lumi/base"
7)
8
9type Ref[T any] struct {
10nodes map[kelo.NodeValuer]kelo.NodeValuer
11value T
12bonds []base.Updater
13}
14
15func NewRef[T any](value T) *Ref[T] {
16return &Ref[T]{
17nodes: make(map[kelo.NodeValuer]kelo.NodeValuer),
18value: value,
19}
20}
21
22func (r *Ref[T]) Get() T {
23return r.value
24}
25
26func (r *Ref[T]) Set(value T) {
27r.value = value
28if len(r.nodes) > 0 {
29for _, node := range r.nodes {
30node.SetNodeValue(r.String())
31}
32}
33for _, bond := range r.bonds {
34bond.Update()
35}
36}
37
38func (r *Ref[T]) Stick(updater base.Updater) {
39for _, bond := range r.bonds {
40if bond == updater {
41return
42}
43}
44r.bonds = append(r.bonds, updater)
45}
46
47func (r *Ref[T]) UnStick(updater base.Updater) {
48for i, bond := range r.bonds {
49if bond != updater {
50continue
51}
52r.bonds = append(r.bonds[:i], r.bonds[i+1:]...)
53return
54}
55}
56
57func (r *Ref[T]) String() string {
58return fmt.Sprintf("%v", r.value)
59}
60
61func (r *Ref[T]) Render(parent kelo.NodeValuer) kelo.NodeValuer {
62if _, ok := r.nodes[parent]; !ok {
63r.nodes[parent] = kelo.GetDocument().CreateTextNode(r.String())
64}
65return r.nodes[parent]
66}
67