# HG changeset patch # User Steve Losh # Date 1556658406 14400 # Node ID 28724d30efef19dacec09f446d6b9a2b76ec8f85 # Parent 861b0bbcb3198f5cc5b911fa95baf6e51a6941c8# Parent 71b34a9a34137f752b911fd6201e53e2d4809365 Merge. diff -r 71b34a9a3413 -r 28724d30efef package.lisp --- a/package.lisp Fri Mar 08 22:09:23 2019 -0500 +++ b/package.lisp Tue Apr 30 17:06:46 2019 -0400 @@ -233,7 +233,13 @@ (:documentation "Utilities for operating on hash tables.") (:export :hash-table-contents - :mutate-hash-values)) + :mutate-hash-values + :remhash-if + :remhash-if-not + :remhash-if-key + :remhash-if-not-key + :remhash-if-value + :remhash-if-not-value)) (defpackage :losh.random diff -r 71b34a9a3413 -r 28724d30efef src/hash-tables.lisp --- a/src/hash-tables.lisp Fri Mar 08 22:09:23 2019 -0500 +++ b/src/hash-tables.lisp Tue Apr 30 17:06:46 2019 -0400 @@ -15,3 +15,64 @@ "Return a fresh list of `(key value)` elements of `hash-table`." (gathering (maphash (compose #'gather #'list) hash-table))) +(defun remhash-if (test hash-table) + "Remove elements which satisfy `(test key value)` from `hash-table`. + + Returns the hash table." + (maphash (lambda (k v) + (when (funcall test k v) + (remhash k hash-table))) + hash-table) + hash-table) + +(defun remhash-if-not (test hash-table) + "Remove elements which don't satisfy `(test key value)` from `hash-table`. + + Returns the hash table." + (maphash (lambda (k v) + (unless (funcall test k v) + (remhash k hash-table))) + hash-table) + hash-table) + +(defun remhash-if-key (test hash-table) + "Remove elements which satisfy `(test key)` from `hash-table`. + + Returns the hash table." + (maphash (lambda (k v) + (declare (ignore v)) + (when (funcall test k) + (remhash k hash-table))) + hash-table) + hash-table) + +(defun remhash-if-not-key (test hash-table) + "Remove elements which satisfy don't `(test key)` from `hash-table`. + + Returns the hash table." + (maphash (lambda (k v) + (declare (ignore v)) + (unless (funcall test k) + (remhash k hash-table))) + hash-table) + hash-table) + +(defun remhash-if-value (test hash-table) + "Remove elements which satisfy `(test value)` from `hash-table`. + + Returns the hash table." + (maphash (lambda (k v) + (when (funcall test v) + (remhash k hash-table))) + hash-table) + hash-table) + +(defun remhash-if-not-value (test hash-table) + "Remove elements which satisfy don't `(test value)` from `hash-table`. + + Returns the hash table." + (maphash (lambda (k v) + (unless (funcall test v) + (remhash k hash-table))) + hash-table) + hash-table)