@@ -38,8 +38,8 @@ class QuickSorter extends Reactor {
3838 resultArr : State < number [ ] > ;
3939 numFragments : State < number > ;
4040
41- leftReactor : Reactor | undefined ;
42- rightReactor : Reactor | undefined ;
41+ leftReactor : State < QuickSorter | undefined > ;
42+ rightReactor : State < QuickSorter | undefined > ;
4343
4444 constructor ( parent : Reactor ) {
4545 super ( parent ) ;
@@ -52,6 +52,9 @@ class QuickSorter extends Reactor {
5252 this . resultArr = new State ( [ ] ) ;
5353 this . numFragments = new State ( 0 ) ;
5454
55+ this . leftReactor = new State ( undefined ) ;
56+ this . rightReactor = new State ( undefined ) ;
57+
5558 // When the parent sends a message, we send it to children.
5659 this . addMutation (
5760 [ this . parentReadPort ] ,
@@ -63,7 +66,9 @@ class QuickSorter extends Reactor {
6366 this . leftReadPort ,
6467 this . rightReadPort ,
6568 this . resultArr ,
66- this . numFragments
69+ this . numFragments ,
70+ this . leftReactor ,
71+ this . rightReactor
6772 ] ,
6873 function (
6974 this ,
@@ -74,7 +79,9 @@ class QuickSorter extends Reactor {
7479 leftread ,
7580 rightread ,
7681 resultArr ,
77- numFragments
82+ numFragments ,
83+ stateLeftReactor , // This is really cursed, but s_ is to indicate that this is a state
84+ stateRightReactor
7885 ) {
7986 const hierarchyImplementation = (
8087 useHierarchy ? this . addChild : this . addSibling
@@ -105,6 +112,9 @@ class QuickSorter extends Reactor {
105112 const leftReactor = hierarchyImplementation ( QuickSorter ) ;
106113 const rightReactor = hierarchyImplementation ( QuickSorter ) ;
107114
115+ stateLeftReactor . set ( leftReactor ) ;
116+ stateRightReactor . set ( rightReactor ) ;
117+
108118 // Connect ports accoringly
109119 this . connect ( leftWritePort , leftReactor . parentReadPort ) ;
110120 this . connect ( rightWritePort , rightReactor . parentReadPort ) ;
@@ -117,17 +127,26 @@ class QuickSorter extends Reactor {
117127 }
118128 ) ;
119129
120- this . addReaction (
130+ this . addMutation (
121131 [ this . leftReadPort ] ,
122132 [
123133 this . leftReadPort ,
124134 this . resultArr ,
125135 this . numFragments ,
126- this . writable ( this . parentWritePort )
136+ this . writable ( this . parentWritePort ) ,
137+ this . leftReactor
127138 ] ,
128- function ( this , leftreadport , resultArr , numFragments , parentWrite ) {
139+ function (
140+ this ,
141+ leftreadport ,
142+ resultArr ,
143+ numFragments ,
144+ parentWrite ,
145+ stateLeftReactor
146+ ) {
129147 const leftResult = leftreadport . get ( ) ;
130148 const myResult = resultArr . get ( ) ;
149+ const leftReactor = stateLeftReactor . get ( ) ;
131150 if ( leftResult == null ) {
132151 throw Error ( "Left return null" ) ;
133152 }
@@ -136,28 +155,43 @@ class QuickSorter extends Reactor {
136155 "Result length is 0, but should contain at least the pivots."
137156 ) ;
138157 }
158+ if ( leftReactor == null ) {
159+ throw Error ( "Right reactor is null." ) ;
160+ }
139161
140162 console . log ( `I received a result from my left! ${ leftResult } !` ) ;
141163 resultArr . set ( [ ...leftResult , ...myResult ] ) ;
142164
165+ this . delete ( leftReactor ) ;
166+ stateLeftReactor . set ( undefined ) ;
167+
143168 numFragments . set ( numFragments . get ( ) + 1 ) ;
144169 if ( numFragments . get ( ) === 3 ) {
145170 parentWrite . set ( resultArr . get ( ) ) ;
146171 }
147172 }
148173 ) ;
149174
150- this . addReaction (
175+ this . addMutation (
151176 [ this . rightReadPort ] ,
152177 [
153178 this . rightReadPort ,
154179 this . resultArr ,
155180 this . numFragments ,
156- this . writable ( this . parentWritePort )
181+ this . writable ( this . parentWritePort ) ,
182+ this . rightReactor
157183 ] ,
158- function ( this , rightreadport , resultArr , numFragments , parentWrite ) {
184+ function (
185+ this ,
186+ rightreadport ,
187+ resultArr ,
188+ numFragments ,
189+ parentWrite ,
190+ stateRightReactor
191+ ) {
159192 const rightResult = rightreadport . get ( ) ;
160193 const myResult = resultArr . get ( ) ;
194+ const rightReactor = stateRightReactor . get ( ) ;
161195 if ( rightResult == null ) {
162196 throw Error ( "Right return null" ) ;
163197 }
@@ -166,10 +200,18 @@ class QuickSorter extends Reactor {
166200 "Result length is 0, but should contain at least the pivots."
167201 ) ;
168202 }
203+ if ( rightReactor == null ) {
204+ throw Error ( "Right reactor is null." ) ;
205+ }
169206
170207 console . log ( `I received a result from my right! ${ rightResult } !` ) ;
171208 resultArr . set ( [ ...myResult , ...rightResult ] ) ;
172209
210+ // Destroy right reactor and the connection
211+
212+ this . delete ( rightReactor ) ;
213+ stateRightReactor . set ( undefined ) ;
214+
173215 numFragments . set ( numFragments . get ( ) + 1 ) ;
174216 if ( numFragments . get ( ) === 3 ) {
175217 parentWrite . set ( resultArr . get ( ) ) ;
0 commit comments