@@ -38,8 +38,8 @@ class QuickSorter extends Reactor {
38
38
resultArr : State < number [ ] > ;
39
39
numFragments : State < number > ;
40
40
41
- leftReactor : Reactor | undefined ;
42
- rightReactor : Reactor | undefined ;
41
+ leftReactor : State < QuickSorter | undefined > ;
42
+ rightReactor : State < QuickSorter | undefined > ;
43
43
44
44
constructor ( parent : Reactor ) {
45
45
super ( parent ) ;
@@ -52,6 +52,9 @@ class QuickSorter extends Reactor {
52
52
this . resultArr = new State ( [ ] ) ;
53
53
this . numFragments = new State ( 0 ) ;
54
54
55
+ this . leftReactor = new State ( undefined ) ;
56
+ this . rightReactor = new State ( undefined ) ;
57
+
55
58
// When the parent sends a message, we send it to children.
56
59
this . addMutation (
57
60
[ this . parentReadPort ] ,
@@ -63,7 +66,9 @@ class QuickSorter extends Reactor {
63
66
this . leftReadPort ,
64
67
this . rightReadPort ,
65
68
this . resultArr ,
66
- this . numFragments
69
+ this . numFragments ,
70
+ this . leftReactor ,
71
+ this . rightReactor
67
72
] ,
68
73
function (
69
74
this ,
@@ -74,7 +79,9 @@ class QuickSorter extends Reactor {
74
79
leftread ,
75
80
rightread ,
76
81
resultArr ,
77
- numFragments
82
+ numFragments ,
83
+ stateLeftReactor , // This is really cursed, but s_ is to indicate that this is a state
84
+ stateRightReactor
78
85
) {
79
86
const hierarchyImplementation = (
80
87
useHierarchy ? this . addChild : this . addSibling
@@ -105,6 +112,9 @@ class QuickSorter extends Reactor {
105
112
const leftReactor = hierarchyImplementation ( QuickSorter ) ;
106
113
const rightReactor = hierarchyImplementation ( QuickSorter ) ;
107
114
115
+ stateLeftReactor . set ( leftReactor ) ;
116
+ stateRightReactor . set ( rightReactor ) ;
117
+
108
118
// Connect ports accoringly
109
119
this . connect ( leftWritePort , leftReactor . parentReadPort ) ;
110
120
this . connect ( rightWritePort , rightReactor . parentReadPort ) ;
@@ -117,17 +127,26 @@ class QuickSorter extends Reactor {
117
127
}
118
128
) ;
119
129
120
- this . addReaction (
130
+ this . addMutation (
121
131
[ this . leftReadPort ] ,
122
132
[
123
133
this . leftReadPort ,
124
134
this . resultArr ,
125
135
this . numFragments ,
126
- this . writable ( this . parentWritePort )
136
+ this . writable ( this . parentWritePort ) ,
137
+ this . leftReactor
127
138
] ,
128
- function ( this , leftreadport , resultArr , numFragments , parentWrite ) {
139
+ function (
140
+ this ,
141
+ leftreadport ,
142
+ resultArr ,
143
+ numFragments ,
144
+ parentWrite ,
145
+ stateLeftReactor
146
+ ) {
129
147
const leftResult = leftreadport . get ( ) ;
130
148
const myResult = resultArr . get ( ) ;
149
+ const leftReactor = stateLeftReactor . get ( ) ;
131
150
if ( leftResult == null ) {
132
151
throw Error ( "Left return null" ) ;
133
152
}
@@ -136,28 +155,43 @@ class QuickSorter extends Reactor {
136
155
"Result length is 0, but should contain at least the pivots."
137
156
) ;
138
157
}
158
+ if ( leftReactor == null ) {
159
+ throw Error ( "Right reactor is null." ) ;
160
+ }
139
161
140
162
console . log ( `I received a result from my left! ${ leftResult } !` ) ;
141
163
resultArr . set ( [ ...leftResult , ...myResult ] ) ;
142
164
165
+ this . delete ( leftReactor ) ;
166
+ stateLeftReactor . set ( undefined ) ;
167
+
143
168
numFragments . set ( numFragments . get ( ) + 1 ) ;
144
169
if ( numFragments . get ( ) === 3 ) {
145
170
parentWrite . set ( resultArr . get ( ) ) ;
146
171
}
147
172
}
148
173
) ;
149
174
150
- this . addReaction (
175
+ this . addMutation (
151
176
[ this . rightReadPort ] ,
152
177
[
153
178
this . rightReadPort ,
154
179
this . resultArr ,
155
180
this . numFragments ,
156
- this . writable ( this . parentWritePort )
181
+ this . writable ( this . parentWritePort ) ,
182
+ this . rightReactor
157
183
] ,
158
- function ( this , rightreadport , resultArr , numFragments , parentWrite ) {
184
+ function (
185
+ this ,
186
+ rightreadport ,
187
+ resultArr ,
188
+ numFragments ,
189
+ parentWrite ,
190
+ stateRightReactor
191
+ ) {
159
192
const rightResult = rightreadport . get ( ) ;
160
193
const myResult = resultArr . get ( ) ;
194
+ const rightReactor = stateRightReactor . get ( ) ;
161
195
if ( rightResult == null ) {
162
196
throw Error ( "Right return null" ) ;
163
197
}
@@ -166,10 +200,18 @@ class QuickSorter extends Reactor {
166
200
"Result length is 0, but should contain at least the pivots."
167
201
) ;
168
202
}
203
+ if ( rightReactor == null ) {
204
+ throw Error ( "Right reactor is null." ) ;
205
+ }
169
206
170
207
console . log ( `I received a result from my right! ${ rightResult } !` ) ;
171
208
resultArr . set ( [ ...myResult , ...rightResult ] ) ;
172
209
210
+ // Destroy right reactor and the connection
211
+
212
+ this . delete ( rightReactor ) ;
213
+ stateRightReactor . set ( undefined ) ;
214
+
173
215
numFragments . set ( numFragments . get ( ) + 1 ) ;
174
216
if ( numFragments . get ( ) === 3 ) {
175
217
parentWrite . set ( resultArr . get ( ) ) ;
0 commit comments