1
+ #!/usr/bin/env ts-node
2
+ 'use strict' ;
3
+
1
4
export interface KeyVal < V , K > {
2
5
key ?: K ,
3
6
val : V ,
@@ -187,7 +190,7 @@ class SortedQueue<V, K = any> {
187
190
188
191
}
189
192
190
- * inOr3der ( node : SortedQueueNode < any , any > ) : any {
193
+ * inOr3der ( node : SortedQueueNode < any , any > = this . rootNode ) : any {
191
194
192
195
if ( node === null ) {
193
196
return ;
@@ -205,7 +208,7 @@ class SortedQueue<V, K = any> {
205
208
206
209
}
207
210
208
- [ Symbol . iterator ] ( node : SortedQueueNode < any , any > ) : any {
211
+ [ Symbol ( 'foo' ) ] ( node : SortedQueueNode < any , any > ) : any {
209
212
210
213
const sq = this ;
211
214
let currentNode = this . rootNode ;
@@ -250,34 +253,7 @@ class SortedQueue<V, K = any> {
250
253
}
251
254
252
255
iterator ( ) {
253
-
254
- const sq = this ;
255
-
256
- return {
257
-
258
- [ Symbol . iterator ] ( node : SortedQueueNode < any , any > ) : any {
259
-
260
- return {
261
- next ( ) {
262
-
263
- for ( const n of sq . iterator ( ) ) {
264
-
265
- }
266
-
267
- if ( node . right ) {
268
- return
269
- }
270
-
271
- return {
272
- done : false ,
273
- value : < unknown > null
274
- }
275
-
276
- }
277
- }
278
-
279
- }
280
- }
256
+ return this ;
281
257
}
282
258
283
259
iterateAll ( cb : ( v : number ) => void ) {
@@ -305,6 +281,53 @@ class SortedQueue<V, K = any> {
305
281
}
306
282
}
307
283
284
+ [ Symbol ( 'iterator' ) ] ( ) {
285
+ const stack : any [ ] = [ this . rootNode ] ;
286
+ let currentNode = this . rootNode ;
287
+
288
+ return {
289
+ next ( ) {
290
+ while ( currentNode !== null || stack . length > 0 ) {
291
+ if ( currentNode !== null ) {
292
+ stack . push ( currentNode ) ;
293
+ currentNode = currentNode . left || null ;
294
+ } else {
295
+ const node = stack . pop ( ) ;
296
+ // currentNode = node.right;
297
+ // currentNode = stack.pop();
298
+ currentNode = node . right || null ;
299
+ return { done : false , value : node . val } ;
300
+ }
301
+ }
302
+ return { done : true , value : null } ;
303
+ }
304
+ } ;
305
+ }
306
+
307
+ [ Symbol . iterator ] ( ) {
308
+ const stack : any [ ] = [ ] ;
309
+ let currentNode = this . rootNode ;
310
+
311
+ return {
312
+ next ( ) {
313
+
314
+ while ( currentNode !== null ) {
315
+ stack . push ( currentNode ) ;
316
+ currentNode = currentNode . left || null ;
317
+ }
318
+
319
+ if ( stack . length < 1 ) {
320
+ return { done : true , value : null } ;
321
+ }
322
+
323
+ const node = stack . pop ( ) ;
324
+ currentNode = node . right || null ;
325
+ return { done : false , value : node . val } ;
326
+
327
+ }
328
+ } ;
329
+ }
330
+
308
331
find ( val : V ) {
309
332
310
333
let currentNode = this . rootNode ;
@@ -414,6 +437,7 @@ const rootNode = getNode(0.5, 0.25, 1);
414
437
console . timeEnd ( 'foo' ) ;
415
438
// process.exit(0);
416
439
440
+
417
441
const rootNode2 = new SortedQueueNode < number , number > (
418
442
{ val : 0.5 } ,
419
443
@@ -468,6 +492,8 @@ const sq = new SortedQueue(rootNode, {
468
492
compareByNum : ( ( a , b ) => ( a as number ) - ( b as number ) ) ,
469
493
} ) ;
470
494
495
+
496
+
471
497
const vals = [ ] ;
472
498
473
499
console . time ( 'start' ) ;
@@ -483,13 +509,29 @@ for (let i = 0; i < 1000; i++) {
483
509
console . timeEnd ( 'start' ) ;
484
510
485
511
512
+ const runLog0 = ( ) => {
513
+ let count = 0 ;
514
+ let prev : any = 0 ;
515
+ console . time ( 'bar0' )
516
+ for ( const v of sq ) {
517
+ if ( v <= prev ) {
518
+ console . log ( count ++ , v ) ;
519
+ throw 'smaller 2' ;
520
+ }
521
+ prev = v ;
522
+ // console.log(count++, v);
523
+ }
524
+ console . timeEnd ( 'bar0' ) ;
525
+
526
+ }
527
+
486
528
const runLog1 = ( ) => {
487
529
488
530
let previous = 0 ;
489
531
let count = 0 ;
490
532
491
533
console . time ( 'bar1' )
492
- for ( const z of sq . inOr3der ( sq . rootNode ) ) {
534
+ for ( const z of sq . inOr3der ( ) ) {
493
535
if ( z < previous ) {
494
536
throw new Error ( 'smaller.' ) ;
495
537
}
@@ -540,6 +582,7 @@ const runLog3 = () => {
540
582
console . log ( { count} ) ;
541
583
}
542
584
585
+ runLog0 ( ) ;
543
586
runLog1 ( ) ;
544
587
runLog2 ( ) ;
545
588
runLog3 ( ) ;
@@ -578,9 +621,9 @@ doRecurse(rootNode, 0);
578
621
// console.log(sq);
579
622
580
623
581
- for ( const v of vals ) {
582
- console . log ( sq . find ( v ) . numOfSearches ) ;
583
- }
624
+ // for (const v of vals) {
625
+ // console.log(sq.find(v).numOfSearches);
626
+ // }
584
627
585
628
console . log ( sq . find ( 0.5 ) . numOfSearches ) ;
586
629
console . log ( sq . find ( 0.25 ) . numOfSearches ) ;
0 commit comments