diff options
| author | 2025-02-15 19:19:23 -0500 | |
|---|---|---|
| committer | 2025-02-15 19:19:23 -0500 | |
| commit | 219b161b96bcca708ee5e431c14fb453c0b593a2 (patch) | |
| tree | 90a1034690b387ad9332086f56cd90a03a802d70 /mcgoron | |
| parent | node->in-order-generator (diff) | |
node->reverse-order-generator
Diffstat (limited to 'mcgoron')
| -rw-r--r-- | mcgoron/weight-balanced-trees/internal.scm | 24 | ||||
| -rw-r--r-- | mcgoron/weight-balanced-trees/internal.sld | 3 |
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")) |
