summaryrefslogtreecommitdiffstats
path: root/srfi/225/srfi-125-impl.sld
diff options
context:
space:
mode:
authorGravatar Arvydas Silanskas 2022-08-06 11:35:06 +0300
committerGravatar Arvydas Silanskas 2022-08-06 11:35:06 +0300
commitfd4585b6e0ac67ae9591a4183fb7c82ed3a30218 (patch)
tree8da6ad7744c6b26cbcf3acdd7d08e83c33c5e014 /srfi/225/srfi-125-impl.sld
parentMerge branch 'master' of https://github.com/johnwcowan/srfi-225 (diff)
return alists; refactor structure
Diffstat (limited to 'srfi/225/srfi-125-impl.sld')
-rw-r--r--srfi/225/srfi-125-impl.sld149
1 files changed, 149 insertions, 0 deletions
diff --git a/srfi/225/srfi-125-impl.sld b/srfi/225/srfi-125-impl.sld
new file mode 100644
index 0000000..a987787
--- /dev/null
+++ b/srfi/225/srfi-125-impl.sld
@@ -0,0 +1,149 @@
+(define-library
+ (srfi 225 srfi-125-impl)
+ (import (scheme base)
+ (srfi 128)
+ (prefix (srfi 125) t125-)
+ (srfi 225 default-impl)
+ (srfi 225 indexes))
+ (export hash-table-dto)
+ (begin
+
+ (define (t125-hash-table-pure?* dto table)
+ #f)
+
+ (define (t125-hash-table-set* dto table . obj)
+ (apply t125-hash-table-set! (cons table obj))
+ table)
+
+ (define (t125-hash-table-update* dto table key updater fail success)
+ (t125-hash-table-update! table key updater fail success)
+ table)
+
+ (define (t125-hash-table-update/default* dto table key proc default)
+ (t125-hash-table-update!/default table key proc default)
+ table)
+
+ (define (t125-hash-table-intern* dto table key failure)
+ (values table (t125-hash-table-intern! table key failure)))
+
+ (define (t125-hash-table-pop* dto table)
+ (if (t125-hash-table-empty? table)
+ (error "popped empty dictionary")
+ (call-with-values (lambda () (t125-hash-table-pop! table))
+ (lambda (key value) (values table key value)))))
+
+ (define (t125-hash-table-delete-all* dto table keys)
+ (for-each
+ (lambda (key)
+ (t125-hash-table-delete! table key))
+ keys)
+ table)
+
+ (define (t125-hash-table-map* dto proc table)
+ (t125-hash-table-map! proc table))
+
+ (define (t125-hash-table-filter* dto proc table)
+ (t125-hash-table-prune!
+ (lambda (key value)
+ (not (proc key value)))
+ table)
+ table)
+
+ (define (t125-hash-table-remove* dto proc table)
+ (t125-hash-table-prune! proc table)
+ table)
+
+ (define (t125-hash-table-find-update* dto table key fail success)
+ ;; instead of running immediately,
+ ;; add an indirection through thunk
+ ;; to guarantee call in tail position
+ (define (make-success-thunk value)
+ (define (update new-key new-value)
+ (unless (eq? new-key key)
+ (t125-hash-table-delete! table key))
+ (t125-hash-table-set! table new-key new-value)
+ table)
+ (define (remove)
+ (t125-hash-table-delete! table key)
+ table)
+ (lambda ()
+ (success key value update remove) ))
+ (define (make-failure-thunk)
+ (define (ignore)
+ table)
+ (define (insert value)
+ (t125-hash-table-set! table key value)
+ table)
+ (lambda ()
+ (fail insert ignore)))
+ (define thunk (t125-hash-table-ref table key make-failure-thunk make-success-thunk))
+ (thunk))
+
+ (define (t125-hash-table-comparator* dto table)
+ (make-comparator (lambda args #t)
+ (t125-hash-table-equivalence-function table)
+ #f
+ (t125-hash-table-hash-function table)))
+
+ (define (t125-hash-table-size* dto table)
+ (t125-hash-table-size table))
+
+ (define (t125-hash-table-keys* dto table)
+ (t125-hash-table-keys table))
+
+ (define (t125-hash-table-values* dto table)
+ (t125-hash-table-values table))
+
+ (define (t125-hash-table-entries* dto table)
+ (t125-hash-table-entries table))
+
+ (define (t125-hash-table-fold* dto proc knil table)
+ (t125-hash-table-fold proc knil table))
+
+ (define (t125-hash-table-map->list* dto proc table)
+ (t125-hash-table-map->list proc table))
+
+ (define (t125-hash-table->alist* dto table)
+ (t125-hash-table->alist table))
+
+ (define (t125-hash-table?* dto table)
+ (t125-hash-table? table))
+
+ (define (t125-hash-table-empty?* dto table)
+ (t125-hash-table-empty? table))
+
+ (define (t125-hash-table-contains?* dto table key)
+ (t125-hash-table-contains? table key))
+
+ (define (t125-hash-table-ref* dto table key failure success)
+ (t125-hash-table-ref table key failure success))
+
+ (define (t125-hash-table-ref/default* dto table key default)
+ (t125-hash-table-ref/default table key default))
+
+ (define hash-table-dto
+ (make-dto
+ dictionary?-id t125-hash-table?*
+ dict-pure?-id t125-hash-table-pure?*
+ dict-empty?-id t125-hash-table-empty?*
+ dict-contains?-id t125-hash-table-contains?*
+ dict-ref-id t125-hash-table-ref*
+ dict-ref/default-id t125-hash-table-ref/default*
+ dict-set-id t125-hash-table-set*
+ dict-delete-all-id t125-hash-table-delete-all*
+ dict-intern-id t125-hash-table-intern*
+ dict-update-id t125-hash-table-update*
+ dict-update/default-id t125-hash-table-update/default*
+ dict-pop-id t125-hash-table-pop*
+ dict-map-id t125-hash-table-map*
+ dict-filter-id t125-hash-table-filter*
+ dict-remove-id t125-hash-table-remove*
+ dict-find-update-id t125-hash-table-find-update*
+ dict-size-id t125-hash-table-size*
+ dict-keys-id t125-hash-table-keys*
+ dict-values-id t125-hash-table-values*
+ dict-entries-id t125-hash-table-entries*
+ dict-fold-id t125-hash-table-fold*
+ dict-map->list-id t125-hash-table-map->list*
+ dict->alist-id t125-hash-table->alist*
+ dict-comparator-id t125-hash-table-comparator*))))