aboutsummaryrefslogtreecommitdiffstats
path: root/csc/hash-map.csc
diff options
context:
space:
mode:
authorRose Hogenson <rhogenson@posteo.net>2022-07-24 16:20:00 -0700
committerRose Hogenson <rhogenson@posteo.net>2022-07-24 16:20:00 -0700
commitc04e3c7cd6726a95da3d58979f582afb7a5b722f (patch)
tree524f25bb188f90d68626a1f402f8de54e00848d4 /csc/hash-map.csc
parentc6b74224fe669bc9d180a409ad13ed269631b316 (diff)
downloadchromatopelma-c04e3c7cd6726a95da3d58979f582afb7a5b722f.tar.zst
Export some common comparers from hash-map.
Diffstat (limited to 'csc/hash-map.csc')
-rw-r--r--csc/hash-map.csc57
1 files changed, 48 insertions, 9 deletions
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 <comparer>
+ (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)
+ ((string<? (symbol->string 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)
+ ((string<? (symbol->string s1) (symbol->string s2)) -1)
+ (else 1)))))
+
+
(define (merge2 m1 m2)
(let ((m1 m1))
(map-for-each