From c04e3c7cd6726a95da3d58979f582afb7a5b722f Mon Sep 17 00:00:00 2001 From: Rose Hogenson Date: Sun, 24 Jul 2022 16:20:00 -0700 Subject: Export some common comparers from hash-map. --- csc/hash-map.csc | 57 +++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 48 insertions(+), 9 deletions(-) (limited to 'csc/hash-map.csc') diff --git a/csc/hash-map.csc b/csc/hash-map.csc index 5a604ad..064b4ae 100644 --- a/csc/hash-map.csc +++ b/csc/hash-map.csc @@ -1,17 +1,24 @@ (define-library (csc hash-map) (export alist->map + compare-numbers + compare-strings + compare-symbols + delete hash-bytevector insert key-not-found-error? lookup + make-comparer make-map - delete map->alist map-for-each map? merge) (import (scheme base) + (only (csc loop) + loop + return) (only (csc match) define-match-record-type match) @@ -198,8 +205,15 @@ (root map-root)) - (define (make-map hash cmp) - (construct-map hash cmp '())) + (define-record-type + (make-comparer hash cmp) + comparer? + (hash comparer-hash) + (cmp comparer-cmp)) + + + (define (make-map comparer) + (construct-map (comparer-hash comparer) (comparer-cmp comparer) '())) (define (shuffle n) @@ -269,12 +283,11 @@ alist)) - (define (alist->map hash cmp alist) - (let loop ((alist alist) - (m (make-map hash cmp))) - (if (null? alist) - m - (loop (cdr alist) (insert m (caar alist) (cdar alist)))))) + (define (alist->map comparer alist) + (loop with m = (make-map comparer) + for elem in alist + do (set! m (insert m (car elem) (cdr elem))) + finally (return m))) (define (hash-bytevector b) @@ -285,6 +298,32 @@ (loop (+ 1 i) (+ (* hash #x100) (bytevector-u8-ref b i)))))) + (define compare-symbols + (make-comparer + (lambda (s) (hash-bytevector (string->utf8 (symbol->string s)))) + (lambda (s1 s2) + (cond + ((symbol=? s1 s2) 0) + ((stringstring s1) (symbol->string s2)) -1) + (else 1))))) + + + (define compare-numbers + (make-comparer + (lambda (x) x) + (lambda (y x) (- y x)))) + + + (define compare-strings + (make-comparer + (lambda (s) (hash-bytevector (string->utf8 s))) + (lambda (s1 s2) + (cond + ((string=? s1 s2) 0) + ((stringstring s1) (symbol->string s2)) -1) + (else 1))))) + + (define (merge2 m1 m2) (let ((m1 m1)) (map-for-each -- cgit v1.3.1