-
Notifications
You must be signed in to change notification settings - Fork 0
/
graph_elem.go
171 lines (149 loc) · 3.22 KB
/
graph_elem.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
package graph
import (
"github.com/15mga/kiwi/ds"
"github.com/15mga/kiwi/util"
)
type IGraphElem interface {
Name() string
Path() string
Comment() string
SetComment(c string)
Data() util.M
SetData(data util.M)
Start() *util.Err
Enable() *util.Err //即使已可用,也会重复执行
Disable() *util.Err //即使不可用,也会重复执行
SetEnable(enable bool) *util.Err //已经是该状态不会重复执行
Enabled() bool
AddBeforeEnable(fn util.BoolToErr) //添加节点切换是否可用之前调用
DelBeforeEnable(fn util.BoolToErr) //移除节点切换是否可用之前调用
AddAfterEnable(fn util.FnBool) //添加节点切换是否可用之后调用
DelAfterEnable(fn util.FnBool) //移除节点切换是否可用之后调用
Graph() IGraph
RootGraph() IGraph
}
func newGraphElem(g IGraph, name string) IGraphElem {
e := &graphElem{
name: name,
enabled: true,
beforeEnable: ds.NewFnErrLink1[bool](),
afterEnable: ds.NewFnLink1[bool](),
g: g,
data: util.M{},
}
sg, ok := g.(ISubGraph)
if ok {
e.path = sg.Path() + "." + name
} else {
e.path = name
}
pg, ok := g.(ISubGraph)
if ok {
e.rg = pg.RootGraph()
} else {
e.rg = e.Graph()
}
return e
}
type graphElem struct {
name string
comment string
path string
data util.M
enabled bool
beforeEnable *ds.FnErrLink1[bool]
afterEnable *ds.FnLink1[bool]
g IGraph
rg IGraph
}
func (e *graphElem) Name() string {
return e.name
}
func (e *graphElem) Path() string {
return e.path
}
func (e *graphElem) Comment() string {
return e.comment
}
func (e *graphElem) SetComment(comment string) {
e.comment = comment
}
func (e *graphElem) Data() util.M {
return e.data
}
func (e *graphElem) SetData(data util.M) {
e.data = data
}
func (e *graphElem) Start() *util.Err {
if e.enabled {
err := e.Enable()
if err != nil {
return err
}
}
return nil
}
func (e *graphElem) Enable() *util.Err {
if e.beforeEnable != nil {
err := e.beforeEnable.Invoke(true)
if err != nil {
return err
}
}
e.enabled = true
e.afterEnable.Invoke(true)
return nil
}
func (e *graphElem) Disable() *util.Err {
if e.beforeEnable != nil {
err := e.beforeEnable.Invoke(false)
if err != nil {
return err
}
}
e.enabled = false
e.afterEnable.Invoke(false)
return nil
}
func (e *graphElem) SetEnable(enable bool) *util.Err {
if e.enabled == enable {
return nil
}
if enable {
return e.Enable()
}
return e.Disable()
}
func (e *graphElem) AddBeforeEnable(fn util.BoolToErr) {
if e.beforeEnable == nil {
e.beforeEnable = ds.NewFnErrLink1[bool]()
}
e.beforeEnable.Push(fn)
}
func (e *graphElem) DelBeforeEnable(fn util.BoolToErr) {
if e.beforeEnable == nil {
return
}
e.beforeEnable.Del(fn)
}
func (e *graphElem) AddAfterEnable(fn util.FnBool) {
if e.afterEnable == nil {
e.afterEnable = ds.NewFnLink1[bool]()
}
e.afterEnable.Push(fn)
}
func (e *graphElem) DelAfterEnable(fn util.FnBool) {
if e.afterEnable == nil {
return
}
e.afterEnable.Del(fn)
}
func (e *graphElem) Enabled() bool {
return e.enabled
}
func (e *graphElem) RootGraph() IGraph {
return e.rg
}
func (e *graphElem) Graph() IGraph {
return e.g
}