@@ -43,8 +43,8 @@ class QuickSorter extends Reactor {
43
43
resultArr : State < number [ ] > ;
44
44
numFragments : State < number > ;
45
45
46
- leftReactor : Reactor | undefined ;
47
- rightReactor : Reactor | undefined ;
46
+ leftReactor : State < QuickSorter | undefined > ;
47
+ rightReactor : State < QuickSorter | undefined > ;
48
48
49
49
constructor ( parent : Reactor , name = "root" ) {
50
50
super ( parent , name ) ;
@@ -57,6 +57,9 @@ class QuickSorter extends Reactor {
57
57
this . resultArr = new State ( [ ] ) ;
58
58
this . numFragments = new State ( 0 ) ;
59
59
60
+ this . leftReactor = new State ( void 114514 ) ;
61
+ this . rightReactor = new State ( void 1919810 ) ;
62
+
60
63
// When the parent sends a message, we send it to children.
61
64
this . addMutation (
62
65
[ this . parentReadPort ] ,
@@ -68,7 +71,9 @@ class QuickSorter extends Reactor {
68
71
this . leftReadPort ,
69
72
this . rightReadPort ,
70
73
this . resultArr ,
71
- this . numFragments
74
+ this . numFragments ,
75
+ this . leftReactor ,
76
+ this . rightReactor
72
77
] ,
73
78
function (
74
79
this ,
@@ -79,7 +84,9 @@ class QuickSorter extends Reactor {
79
84
leftread ,
80
85
rightread ,
81
86
resultArr ,
82
- numFragments
87
+ numFragments ,
88
+ s_leftreactor , // This is really cursed, but s_ is to indicate that this is a state
89
+ s_rightreactor
83
90
) {
84
91
const hierarchyImplementation = (
85
92
useHierarchy
@@ -118,6 +125,9 @@ class QuickSorter extends Reactor {
118
125
`${ this . getReactor ( ) . _name } /r`
119
126
) ;
120
127
128
+ s_leftreactor . set ( leftReactor ) ;
129
+ s_rightreactor . set ( rightReactor ) ;
130
+
121
131
// Connect ports accoringly
122
132
this . connect ( leftWritePort , leftReactor . parentReadPort ) ;
123
133
this . connect ( rightWritePort , rightReactor . parentReadPort ) ;
@@ -130,17 +140,26 @@ class QuickSorter extends Reactor {
130
140
}
131
141
) ;
132
142
133
- this . addReaction (
143
+ this . addMutation (
134
144
[ this . leftReadPort ] ,
135
145
[
136
146
this . leftReadPort ,
137
147
this . resultArr ,
138
148
this . numFragments ,
139
- this . writable ( this . parentWritePort )
149
+ this . writable ( this . parentWritePort ) ,
150
+ this . leftReactor
140
151
] ,
141
- function ( this , leftreadport , resultArr , numFragments , parentWrite ) {
152
+ function (
153
+ this ,
154
+ leftreadport ,
155
+ resultArr ,
156
+ numFragments ,
157
+ parentWrite ,
158
+ s_leftreactor
159
+ ) {
142
160
const leftResult = leftreadport . get ( ) ;
143
161
const myResult = resultArr . get ( ) ;
162
+ const leftReactor = s_leftreactor . get ( ) ;
144
163
if ( leftResult == null ) {
145
164
throw Error ( "Left return null" ) ;
146
165
}
@@ -149,28 +168,43 @@ class QuickSorter extends Reactor {
149
168
"Result length is 0, but should contain at least the pivots."
150
169
) ;
151
170
}
171
+ if ( leftReactor == null ) {
172
+ throw Error ( "Right reactor is null." ) ;
173
+ }
152
174
153
175
console . log ( `I received a result from my left! ${ leftResult } !` ) ;
154
176
resultArr . set ( [ ...leftResult , ...myResult ] ) ;
155
177
178
+ this . delete ( leftReactor ) ;
179
+ s_leftreactor . set ( void "kksk" ) ;
180
+
156
181
numFragments . set ( numFragments . get ( ) + 1 ) ;
157
182
if ( numFragments . get ( ) === 3 ) {
158
183
parentWrite . set ( resultArr . get ( ) ) ;
159
184
}
160
185
}
161
186
) ;
162
187
163
- this . addReaction (
188
+ this . addMutation (
164
189
[ this . rightReadPort ] ,
165
190
[
166
191
this . rightReadPort ,
167
192
this . resultArr ,
168
193
this . numFragments ,
169
- this . writable ( this . parentWritePort )
194
+ this . writable ( this . parentWritePort ) ,
195
+ this . rightReactor
170
196
] ,
171
- function ( this , rightreadport , resultArr , numFragments , parentWrite ) {
197
+ function (
198
+ this ,
199
+ rightreadport ,
200
+ resultArr ,
201
+ numFragments ,
202
+ parentWrite ,
203
+ s_rightreactor
204
+ ) {
172
205
const rightResult = rightreadport . get ( ) ;
173
206
const myResult = resultArr . get ( ) ;
207
+ const rightReactor = s_rightreactor . get ( ) ;
174
208
if ( rightResult == null ) {
175
209
throw Error ( "Right return null" ) ;
176
210
}
@@ -179,10 +213,18 @@ class QuickSorter extends Reactor {
179
213
"Result length is 0, but should contain at least the pivots."
180
214
) ;
181
215
}
216
+ if ( rightReactor == null ) {
217
+ throw Error ( "Right reactor is null." ) ;
218
+ }
182
219
183
220
console . log ( `I received a result from my right! ${ rightResult } !` ) ;
184
221
resultArr . set ( [ ...myResult , ...rightResult ] ) ;
185
222
223
+ // Destroy right reactor and the connection
224
+
225
+ this . delete ( rightReactor ) ;
226
+ s_rightreactor . set ( void "tnok" ) ;
227
+
186
228
numFragments . set ( numFragments . get ( ) + 1 ) ;
187
229
if ( numFragments . get ( ) === 3 ) {
188
230
parentWrite . set ( resultArr . get ( ) ) ;
0 commit comments