summaryrefslogtreecommitdiffstats
path: root/srfi
diff options
context:
space:
mode:
authorGravatar Arvydas Silanskas 2021-08-18 23:39:20 +0300
committerGravatar Arvydas Silanskas 2021-08-18 23:39:20 +0300
commit3d9514e4e34c72cb378b74d29a2fcde7579d3bd0 (patch)
treed200f198ad3dfecd6c46df11e035dce1ed070807 /srfi
parentwork (diff)
srfi 126 impl
Diffstat (limited to 'srfi')
-rw-r--r--srfi/225.sld8
-rw-r--r--srfi/srfi-126-impl.scm148
2 files changed, 155 insertions, 1 deletions
diff --git a/srfi/225.sld b/srfi/225.sld
index c009606..da509c4 100644
--- a/srfi/225.sld
+++ b/srfi/225.sld
@@ -25,7 +25,7 @@
(cond-expand
(guile)
- ((library (srfi 126)) (import (srfi 126)))
+ ((library (srfi 126)) (import (prefix (srfi 126) t126:)))
(else))
;; exports
@@ -176,4 +176,10 @@
((library (srfi 125))
(include "srfi-125-impl.scm")
(export hash-table-dtd))
+ (else))
+
+ (cond-expand
+ ((library (srfi 126))
+ (include "srfi-126-impl.scm")
+ (export srfi-126-dtd))
(else)))
diff --git a/srfi/srfi-126-impl.scm b/srfi/srfi-126-impl.scm
new file mode 100644
index 0000000..177a835
--- /dev/null
+++ b/srfi/srfi-126-impl.scm
@@ -0,0 +1,148 @@
+(define srfi-126-dtd
+ (let ()
+
+ (define (prep-dtd-arg proc)
+ (lambda (dtd . args)
+ (apply proc args)))
+
+ (define (t126:make-hashtable* dtd comparator)
+ (t126:make-hashtable (comparator-hash-function comparator)
+ (comparator-equality-predicate comparator)))
+
+ (define (t126:hashtable-ref* dtd table key fail success)
+ (define-values (value found?) (t126:hashtable-lookup table key))
+ (if found?
+ (success value)
+ (fail)))
+
+ (define (t126:hashtable-ref/default* dtd table key default)
+ (t126:hashtable-ref table key default))
+
+ (define (t126:hashtable-set!* dtd table . obj)
+ (let loop ((obj obj))
+ (if (null? obj)
+ table
+ (begin
+ (t126:hashtable-set! table (car obj) (cadr obj))
+ (loop (cddr obj))))))
+
+ (define (t126:hashtable-delete-all!* dtd table keys)
+ (for-each
+ (lambda (key)
+ (t126:hashtable-delete! table key))
+ keys)
+ table)
+
+ (define (t126:hashtable-intern!* dtd table key default)
+ (define val (t126:hashtable-intern! table key default))
+ (values table val))
+
+ (define (t126:hashtable-update/default!* dtd table key updater default)
+ (t126:hashtable-update! table key updater default)
+ table)
+
+ (define (t126:hashtable-pop!* dtd table)
+ (if (t126:hashtable-empty? table)
+ (error "popped empty dictionary")
+ (call-with-values
+ (lambda () (t126:hashtable-pop! table))
+ (lambda (key value) (values table key value)))))
+
+ (define (t126:hashtable-update-all!* dtd proc table)
+ (t126:hashtable-update-all! table proc)
+ table)
+
+ (define (t126:hashtable-filter!* dtd proc table)
+ (t126:hashtable-prune! table
+ (lambda (key value)
+ (not (proc key value))))
+ table)
+
+ (define (t126:hashtable-filter* dtd proc table)
+ (dict-filter! dtd proc (dict-copy dtd table)))
+
+ (define (t126:hashtable-remove!* dtd proc table)
+ (t126:hashtable-prune! table proc)
+ table)
+
+ (define (t126:hashtable-remove* dtd proc table)
+ (dict-remove! dtd proc (dict-copy dtd table)))
+
+ (define (t126:hashtable-search!* dtd table key fail success)
+ (define (handle-success value)
+ (define (update new-key new-value obj)
+ (unless (eq? new-key key)
+ (t126:hashtable-delete! table key))
+ (t126:hashtable-set! table new-key new-value)
+ (values table obj))
+ (define (remove obj)
+ (t126:hashtable-delete! table key)
+ (values table obj))
+ (success key value update remove))
+ (define (handle-fail)
+ (define (ignore obj)
+ (values table obj))
+ (define (insert value obj)
+ (t126:hashtable-set! table key value)
+ (values table obj))
+ (fail insert ignore))
+
+ (define default (cons #f #f))
+ (define found (t126:hashtable-ref table key default))
+ (if (eq? default found)
+ (handle-fail)
+ (handle-success found)))
+
+ (define (t126:hashtable-search* dtd table key fail success)
+ (dict-search! dtd (dict-copy dtd table) key fail success))
+
+ (define (t126:hashtable-for-each* dtd proc table)
+ (t126:hashtable-walk table proc)
+ table)
+
+ (define (t126:hashtable-map->lset* dtd proc table)
+ (t126:hashtable-map->lset table proc))
+
+ (define (t126:hashtable-keys* dtd table)
+ (vector->list (t126:hashtable-keys table)))
+
+ (define (t126:hashtable-values* dtd table)
+ (vector->list (t126:hashtable-values table)))
+
+ (define (t126:hashtable-entries* dtd table)
+ (call-with-values
+ (lambda () (t126:hashtable-entries table))
+ (lambda (keys vals)
+ (values
+ (vector->list keys)
+ (vector->list vals)))))
+
+ (define (t126:hashtable-copy* dtd table)
+ (t126:hashtable-copy table #t))
+
+ (make-dtd
+ make-dictionary-index t126:make-hashtable*
+ dictionary?-index (prep-dtd-arg t126:hashtable?)
+ dict-empty?-index (prep-dtd-arg t126:hashtable-empty?)
+ dict-contains?-index (prep-dtd-arg t126:hashtable-contains?)
+ dict-ref-index t126:hashtable-ref*
+ dict-ref/default-index t126:hashtable-ref/default*
+ dict-set!-index t126:hashtable-set!*
+ dict-delete-all!-index t126:hashtable-delete-all!*
+ dict-intern!-index t126:hashtable-intern!*
+ dict-update/default!-index t126:hashtable-update/default!*
+ dict-pop!-index t126:hashtable-pop!*
+ dict-map!-index t126:hashtable-update-all!*
+ dict-filter!-index t126:hashtable-filter!*
+ dict-filter-index t126:hashtable-filter*
+ dict-remove!-index t126:hashtable-remove!*
+ dict-remove-index t126:hashtable-remove*
+ dict-search!-index t126:hashtable-search!*
+ dict-search-index t126:hashtable-search*
+ dict-size-index (prep-dtd-arg t126:hashtable-size)
+ dict-for-each-index t126:hashtable-for-each*
+ dict-keys-index t126:hashtable-keys*
+ dict-values-index t126:hashtable-values*
+ dict-entries-index t126:hashtable-entries*
+ dict-map->list-index t126:hashtable-map->lset*
+ dict-copy-index t126:hashtable-copy*)))