weak dicts
authorStefan Israelsson Tampe <stefan.itampe@gmail.com>
Fri, 23 Feb 2018 15:00:31 +0000 (16:00 +0100)
committerStefan Israelsson Tampe <stefan.itampe@gmail.com>
Fri, 23 Feb 2018 15:00:31 +0000 (16:00 +0100)
modules/language/python/dict.scm

index a57b771c2f793b9623d2b8db87ffcfbf7061b060..b9f6dd3ebb4ba74087c6492f0486a9b3f6132537 100644 (file)
@@ -16,6 +16,7 @@
             py-iterkeys py-itervalues py-keys py-values
             py-popitem py-setdefault py-update py-clear
             py-hash-ref dict pyhash-listing
+           weak-key-dict weak-value-dict
             ))
 
 (define-syntax-rule (aif it p x y) (let ((it p)) (if it x y)))
     (slot-set! o 'n    0)
     o))
 
+(define (make-py-weak-key-hashtable)
+  (let* ((o (make <py-hashtable>))
+         (t (make-weak-key-hash-table))
+         (h H))
+    (slot-set! o 't    t)
+    (slot-set! o 'h    h)
+    (slot-set! o 'n    0)
+    o))
+
+(define (make-py-weak-value-hashtable)
+  (let* ((o (make <py-hashtable>))
+         (t (make-weak-value-hash-table))
+         (h H))
+    (slot-set! o 't    t)
+    (slot-set! o 'h    h)
+    (slot-set! o 'n    0)
+    o))
+
 (define miss (list 'miss))
 (define-method (pylist-ref (o <hashtable>) x)
   (let ((r (py-hash-ref o x miss)))
                         (pylist-set! self k v))
                       (slot-ref x 't)))))))
       __init__)))
-
 (name-object dict)
 
+(define-python-class weak-key-dict (<py-hashtable>)
+  (define __init__
+    (letrec ((__init__
+              (case-lambda
+                ((self)
+                 (let ((r (make-py-weak-key-hashtable)))
+                   (slot-set! self 't (slot-ref r 't))
+                   (slot-set! self 'h (slot-ref r 'h))
+                   (slot-set! self 'n (slot-ref r 'n))))
+                ((self x)
+                 (__init__ self)
+                 (if (is-a? x <py-hashtable>)
+                     (hash-for-each
+                      (lambda (k v)
+                        (pylist-set! self k v))
+                      (slot-ref x 't)))))))
+      __init__)))
+(name-object weak-key-dict)
+
+(define-python-class weak-value-dict (<py-hashtable>)
+  (define __init__
+    (letrec ((__init__
+              (case-lambda
+                ((self)
+                 (let ((r (make-py-weak-value-hashtable)))
+                   (slot-set! self 't (slot-ref r 't))
+                   (slot-set! self 'h (slot-ref r 'h))
+                   (slot-set! self 'n (slot-ref r 'n))))
+                ((self x)
+                 (__init__ self)
+                 (if (is-a? x <py-hashtable>)
+                     (hash-for-each
+                      (lambda (k v)
+                        (pylist-set! self k v))
+                      (slot-ref x 't)))))))
+      __init__)))
+
+(name-object weak-value-dict)
+
 (define (pyhash-listing)
   (let ((l (to-pylist
             (map symbol->string