From 19c40c18a6a73eadb1bb19f2a2e474516de939a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Pant=C5=AF=C4=8Dek?= Date: Fri, 7 Jul 2023 09:53:45 +0200 Subject: [PATCH] Finding and filtering pairs. --- src/util-bst.scm | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/util-bst.scm b/src/util-bst.scm index 8ad2d57..3d67f74 100644 --- a/src/util-bst.scm +++ b/src/util-bst.scm @@ -26,8 +26,8 @@ bst-balance - ;; bst-find-pair - ;; bst-filter-pairs + bst-find-pair + bst-filter-pairs ;; bst-map-list ;; bst-map-dict @@ -240,8 +240,8 @@ ("Returns all the keys contained in given dictionary.") (let ((res '())) (bst-iter-kv bst - (lambda (k v) - (set! res (cons k res)))) + (lambda (kv) + (set! res (cons (car kv) res)))) (reverse res))) ;; Converts BST to KVV @@ -295,6 +295,25 @@ (kvv->bst (bst->kvv bst))) + (define/doc (bst-find-pair bst pred?) + ("Finds pair by predicate that accepts both key and value.") + (call/cc + (lambda (cc) + (bst-iter-kv bst + (lambda (kv) + (when (pred? (car kv) (cdr kv)) + (cc kv)))) + #f))) + + (define/doc (bst-filter-pairs bst pred?) + ("Returns a list of key-value pairs matching predicate.") + (let ((res '())) + (bst-iter-kv bst + (lambda (kv) + (when (pred? (car kv) (cdr kv)) + (set! res (cons kv res))))) + res)) + ;; Module self-tests (define (util-bst-tests!) (run-tests