-
Notifications
You must be signed in to change notification settings - Fork 2
/
observables.lua
122 lines (84 loc) · 2.09 KB
/
observables.lua
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
Observable = {}
function Observable:new(o)
o = o or {};
setmetatable(o, self);
self.__index = self;
o.var = nil;
o.varOld = nil;
o.observers = {};
return o;
end
function Observable:registerObserver(observer)
--Observer must implement a method called OnValueChanged(sender)
--Var sender helps the observer to identify which observed value changed, if multiple values are observed.
if observer.OnValueChanged == nil then
error(StriLi.Lang.ErrorMsg.ObserverImplement);
return;
end
table.insert(self.observers, observer);
end
function Observable:unregisterObserver(observer)
for key, regObserver in pairs(self.observers) do
if observer == regObserver then
self.observers[key] = nil;
return true;
end
end
return false;
end
function Observable:notify()
--Avoid calling observers, if number did not change
if self.var == self.varOld then
return ;
end
for _, observer in pairs(self.observers) do
observer:OnValueChanged(self);
end
self.varOld = self.var;
end
function Observable:set(n)
self.var = n;
self:notify();
end
function Observable:get()
return self.var;
end
ObservableNumber = Observable:new();
function ObservableNumber:new(o)
o = o or Observable:new(o);
setmetatable(o, self)
self.__index = self
o.var = 0;
o.varOld = 0;
return o;
end
function ObservableNumber:add(n)
self:set(self.var + n);
end
function ObservableNumber:sub(n)
self:set(self.var - n);
end
function ObservableNumber:mul(n)
self:set(self.var * n);
end
function ObservableNumber:divBy(n)
self:set(self.var / n);
end
ObservableString = Observable:new();
function ObservableString:new(o)
o = o or Observable:new(o);
setmetatable(o, self)
self.__index = self
o.var = "";
o.varOld = "";
return o;
end
ObservableBool = Observable:new();
function ObservableBool:new(o)
o = o or Observable:new(o);
setmetatable(o, self)
self.__index = self
o.var = false;
o.varOld = false;
return o;
end