aboutsummaryrefslogtreecommitdiffstats
path: root/mcgoron
diff options
context:
space:
mode:
authorGravatar Peter McGoron 2025-02-15 19:19:23 -0500
committerGravatar Peter McGoron 2025-02-15 19:19:23 -0500
commit219b161b96bcca708ee5e431c14fb453c0b593a2 (patch)
tree90a1034690b387ad9332086f56cd90a03a802d70 /mcgoron
parentnode->in-order-generator (diff)
node->reverse-order-generator
Diffstat (limited to 'mcgoron')
-rw-r--r--mcgoron/weight-balanced-trees/internal.scm24
-rw-r--r--mcgoron/weight-balanced-trees/internal.sld3
2 files changed, 20 insertions, 7 deletions
diff --git a/mcgoron/weight-balanced-trees/internal.scm b/mcgoron/weight-balanced-trees/internal.scm
index e479649..35a25bb 100644
--- a/mcgoron/weight-balanced-trees/internal.scm
+++ b/mcgoron/weight-balanced-trees/internal.scm
@@ -436,17 +436,29 @@
node
(loop (insert comparator node value))))))
-(: node->in-order-generator (node-type -> (-> *)))
-(define (node->in-order-generator node)
+(: node->directed-generator (node-type
+ ((struct <wb-tree>) -> node-type)
+ ((struct <wb-tree>) -> node-type)
+ ->
+ (-> *)))
+(define (node->directed-generator node direction inverse-direction)
(let ((queue (list-queue)))
- (define (traverse-left! node)
+ (define (traverse! node)
(when (not (null? node))
(list-queue-add-front! queue node)
- (traverse-left! (get-left node))))
- (traverse-left! node)
+ (traverse! (direction node))))
+ (traverse! node)
(lambda ()
(if (list-queue-empty? queue)
(eof-object)
(let ((current (list-queue-remove-front! queue)))
- (traverse-left! (get-right current))
+ (traverse! (inverse-direction current))
(get-data current))))))
+
+(: node->in-order-generator (node-type -> (-> *)))
+(define (node->in-order-generator node)
+ (node->directed-generator node get-left get-right))
+
+(: node->reverse-order-generator (node-type -> (-> *)))
+(define (node->reverse-order-generator node)
+ (node->directed-generator node get-right get-left))
diff --git a/mcgoron/weight-balanced-trees/internal.sld b/mcgoron/weight-balanced-trees/internal.sld
index 930daf9..5d99d0c 100644
--- a/mcgoron/weight-balanced-trees/internal.sld
+++ b/mcgoron/weight-balanced-trees/internal.sld
@@ -37,6 +37,7 @@
union intersection difference xor
update insert delete
every
- node->generator generator->node node->in-order-generator)
+ node->generator generator->node
+ node->in-order-generator node->reverse-order-generator)
(include "internal.scm"))