From bcaec2576b1ed27674d838aa49a1db0cdc32908e Mon Sep 17 00:00:00 2001 From: Masaya Tojo Date: Mon, 20 Nov 2017 01:11:21 +0900 Subject: Change APIs and add union procedure. --- lib/tokyo/tojo/map/avl.ss | 224 +++++++++++++++++++++++++++++++++------------- 1 file changed, 161 insertions(+), 63 deletions(-) diff --git a/lib/tokyo/tojo/map/avl.ss b/lib/tokyo/tojo/map/avl.ss index 5ae4c85..59a2deb 100644 --- a/lib/tokyo/tojo/map/avl.ss +++ b/lib/tokyo/tojo/map/avl.ss @@ -1,27 +1,46 @@ #!r6rs (library (tokyo tojo map avl) (export map? empty? empty - insert search (rename (avl:remove remove)) + insert search + (rename (avl:remove remove)) size (rename (avl:map map) + (avl:map/key map/key) (avl:filter filter) + (avl:filter/key filter/key) (avl:partition partition) + (avl:partition/key partition/key) (avl:for-each for-each) + (avl:for-each/key for-each/key) (avl:fold-left fold-left) - (avl:fold-right fold-right))) + (avl:fold-left/key fold-left/key) + (avl:fold-right fold-right) + (avl:fold-right/key fold-right/key)) + union union/key) (import (rnrs)) (define map? (lambda (x) (or (empty? x) (node? x)))) + + ;; (define empty (list 'avl:empty)) + ;; (define empty? (lambda (x) (eq? x empty))) + + ;; (define node (list 'node)) + ;; (define node? (lambda (x) + ;; (and (pair? x) + ;; (eq? (car x) node)))) + ;; (define make-node + ;; (lambda (kv l r h) + ;; (list node kv l r h))) + + ;; (define key&value (lambda (node) (cadr node))) + ;; (define left (lambda (node) (caddr node))) + ;; (define right (lambda (node) (cadddr node))) + ;; (define %height (lambda (node) (cadddr (cdr node)))) (define-record-type (avl:empty make-empty empty?) (opaque #t)) - - (define error-not-avl-tree - (lambda (name x) - (unless (map? x) - (assertion-violation name "not avl tree" x)))) (define empty (make-empty)) @@ -32,6 +51,11 @@ (immutable h %height)) (opaque #t)) + (define error-not-map-tree + (lambda (name x) + (unless (map? x) + (assertion-violation name "not map tree" x)))) + (define height (lambda (tr) (if (empty? tr) @@ -145,16 +169,18 @@ (define insert (case-lambda [(