-
Notifications
You must be signed in to change notification settings - Fork 0
/
engine.d
88 lines (75 loc) · 1.01 KB
/
engine.d
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
module engine;
class ConnectedValue(T)
{
class SetSignal
{
import std.signals;
mixin Signal!(T);
}
this()
{
setSignal = new SetSignal;
}
void set(T rhs)
{
_value = rhs;
emitSet();
}
void connect(ref ConnectedValue other)
{
setSignal.connect(&other.set);
}
void emitSet()
{
setSignal.emit(_value);
}
override string toString()
{
import std.conv : to;
return to!string(_value);
}
@property {
auto value() {
return _value;
}
auto value(T rhs) {
set(rhs);
return value;
}
}
void opAssign(T rhs)
{
value = rhs;
}
SetSignal setSignal;
private:
T _value;
}
class AccumulatedValue(T) : ConnectedValue!T
{
ConnectedValue!(T)[] _terms;
this(ConnectedValue!(T)[] terms ...)
{
_terms = terms;
super();
init();
}
void init()
{
foreach (term; _terms)
{
term.setSignal.connect(&update);
}
update(0);
}
void update(T val)
{
import std.stdio : writeln;
T sum = 0;
foreach (term; _terms)
{
sum += term.value;
}
value = sum;
}
}