diff options
| author | 2021-08-18 23:39:20 +0300 | |
|---|---|---|
| committer | 2021-08-18 23:39:20 +0300 | |
| commit | 3d9514e4e34c72cb378b74d29a2fcde7579d3bd0 (patch) | |
| tree | d200f198ad3dfecd6c46df11e035dce1ed070807 /srfi | |
| parent | work (diff) | |
srfi 126 impl
Diffstat (limited to 'srfi')
| -rw-r--r-- | srfi/225.sld | 8 | ||||
| -rw-r--r-- | srfi/srfi-126-impl.scm | 148 |
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*))) |
