summaryrefslogtreecommitdiffstats
path: root/alist-impl.scm
diff options
context:
space:
mode:
authorGravatar John Cowan 2020-10-19 00:16:32 -0400
committerGravatar GitHub 2020-10-19 00:16:32 -0400
commitb3e41bcd989e76efbb59d66002c31b342a5ccae4 (patch)
tree4cc36dce2842ade22116d37eff30f4f1afe0c7f4 /alist-impl.scm
parentMerge pull request #1 from arvyy/master (diff)
parentfix plist size proc; rewrite dict-entries to use fold (diff)
Merge pull request #2 from arvyy/master
Create library, rewrite tests against external api, add alist, plist and srfi69/125 implementation
Diffstat (limited to 'alist-impl.scm')
-rw-r--r--alist-impl.scm72
1 files changed, 72 insertions, 0 deletions
diff --git a/alist-impl.scm b/alist-impl.scm
new file mode 100644
index 0000000..fab350d
--- /dev/null
+++ b/alist-impl.scm
@@ -0,0 +1,72 @@
+(define (register-alist!)
+
+ (define (alist? l)
+ (and (list? l)
+ (or (null? l)
+ (pair? (car l)))))
+
+ (define (alist-map! proc alist)
+ (map
+ (lambda (e)
+ (define key (car e))
+ (define value (cdr e))
+ (cons key (proc key value)))
+ alist))
+
+ (define (alist-filter! pred alist)
+ (filter
+ (lambda (e)
+ (pred (car e) (cdr e)))
+ alist))
+
+ (define (alist-search! alist key failure success)
+ (define (handle-success pair)
+ (define old-key (car pair))
+ (define old-value (cdr pair))
+ (define (update new-key new-value obj)
+ (cond
+ ((and (eq? old-key
+ new-key)
+ (eq? old-value
+ new-value))
+ (values alist obj))
+ (else
+ (let ((new-list
+ (alist-cons
+ new-key new-value
+ (alist-delete old-key alist))))
+ (values new-list obj)))))
+ (define (remove obj)
+ (values (alist-delete old-key alist) obj))
+ (success old-key old-value update remove))
+
+ (define (handle-failure)
+ (define (insert value obj)
+ (values (alist-cons key value alist)
+ obj))
+ (define (ignore obj)
+ (values alist obj))
+ (failure insert ignore))
+ (cond
+ ((assoc key alist) => handle-success)
+ (else (handle-failure))))
+
+ (define (alist-size alist)
+ (length alist))
+
+ (define (alist-foreach proc alist)
+ (define (proc* e)
+ (proc (car e) (cdr e)))
+ (for-each proc* alist))
+
+ (define (alist->alist alist)
+ alist)
+
+ (register-dictionary!
+ 'dictionary? alist?
+ 'dict-map! alist-map!
+ 'dict-filter! alist-filter!
+ 'dict-search! alist-search!
+ 'dict-size alist-size
+ 'dict-for-each alist-foreach
+ 'dict->alist alist->alist))