summaryrefslogtreecommitdiff
path: root/modules/language/python/set.scm
diff options
context:
space:
mode:
Diffstat (limited to 'modules/language/python/set.scm')
-rw-r--r--modules/language/python/set.scm206
1 files changed, 206 insertions, 0 deletions
diff --git a/modules/language/python/set.scm b/modules/language/python/set.scm
new file mode 100644
index 0000000..5a9cddc
--- /dev/null
+++ b/modules/language/python/set.scm
@@ -0,0 +1,206 @@
+(define-module (language prolog set)
+ #:use-module (oop pf-objects)
+ #:use-module (oop goops)
+ #:use-module (language prolog dict)
+ #:use-module (language prolog for)
+ #:use-module (language prolog try)
+ #:use-module (language prolog list)
+ #:(set))
+
+(define-class <set> () 'dict)
+
+(define-class set (<set>)
+ (define __init__
+ (case-lambda
+ ((self)
+ (slot-set! self 'dict (make-py-hashtable)))
+ ((self x)
+ (let ((d (make-py-hashtable)))
+ (slot-set! self 'dict (make-py-hashtable))
+ (cond
+ ((or (is-a? x <py-list>) (pair? x) (string? x))
+ (for ((y : x)) ()
+ (pyhash-set! d y #t)))
+ ((is-a? x <py-hash>)
+ (slot-set! self 'dict x))
+ (else
+ (raise TypeError)))))))
+
+ (define pop
+ (lambda (self)
+ (call-with-values (lambda () (pyhash-pop! (slot-ref self 'dict)))
+ (lambda (k v) k))))
+
+ (define add
+ (lambda (self k)
+ (pyhash-set! (slot-ref self 'dict) k #t)))
+
+ (define copy
+ (lambda (self)
+ (let ((dict (pyhash-copy (slot-ref self 'dict))))
+ (set dict))))
+
+ (define difference
+ (lambda (self . l)
+ (let* ((d (slot-ref self 'dict))
+ (r (pyhash-copy d)))
+ (let lp ((l l))
+ (if (pair? l)
+ (begin
+ (for ((x : (car l))) ()
+ (when (not (eq? miss (pyhash-ref d x miss)))
+ (pyhash-remove! r x)))
+ (lp (cdr l)))))
+ r)))
+
+ (define difference_update
+ (lambda (self . l)
+ (let* ((r (slot-ref self 'dict)))
+ (let lp ((l l))
+ (if (pair? l)
+ (begin
+ (for ((x : (car l))) ()
+ (when (not (eq? miss (pyhash-ref d x miss)))
+ (pyhash-remove! r x)))
+ (lp (cdr l)))))
+ (values))))
+
+ (define discard
+ (lambda (self . l)
+ (let* ((r (slot-ref self 'dict)))
+ (let lp ((l l))
+ (if (pair? l)
+ (begin
+ (pyhash-remove! d (car l))
+ (lp (cdr l))))))))
+
+ (define intersection
+ (lambda (self . l)
+ (let* ((d (slot-ref self 'dict))
+ (r (pyhash-copy d)))
+ (let lp ((l l))
+ (if (pair? l)
+ (let ((y (car l)))
+ (for ((k : r)) ((dels '()))
+ (if (not (eq? miss (pylist-ref y k miss)))
+ (cons k dels)
+ dels)
+ #:finally
+ (let lp ((dels dels))
+ (if (pair? dels)
+ (begin
+ (pylist-remove! r (car dels))
+ (lp (cdr dels))))))
+ (lp (cdr l)))))
+ r)))
+
+ (define intersection_update
+ (lambda (self . l)
+ (let* ((r (slot-ref self 'dict)))
+ (let lp ((l l))
+ (if (pair? l)
+ (let ((y (car l)))
+ (for ((k : r)) ((dels '()))
+ (if (not (eq? miss (pylist-ref y k miss)))
+ (cons k dels)
+ dels)
+ #:finally
+ (let lp ((dels dels))
+ (if (pair? dels)
+ (begin
+ (pylist-remove! r (car dels))
+ (lp (cdr dels))))))
+ (lp (cdr l))))))))
+
+ (define isdisjoint
+ (lambda (self x)
+ (let* ((r (slot-ref self 'dict))
+ (n1 (len r))
+ (n2 (len x)))
+ (if (< n2 n1)
+ (let ((xx x))
+ (set! x r)
+ (set! r xx)))
+ (for ((k : r)) ()
+ (if (not (eq? miss (pylist-ref x 'k miss)))
+ (break #f))
+ #:finally
+ #t))))
+
+ (define issubset
+ (lambda (self x)
+ (let* ((r (slot-ref self 'dict)))
+ (for ((k : r))
+ (if (eq? miss (pylist-ref x 'k miss))
+ (break #f))
+ #:finally
+ #t))))
+
+ (define issuperset
+ (lambda (self x)
+ (let* ((r (slot-ref self 'dict)))
+ (for ((x : r))
+ (if (eq? miss (pylist-ref r 'k miss))
+ (break #f))
+ #:finally
+ #t))))
+
+ (define remove
+ (lambda (self x)
+ (let* ((r (slot-ref self 'dict)))
+ (if (eq? miss (pylist-ref r x miss))
+ (raise KeyError "missing key in set at remove")
+ (pylist-delete! r x)))))
+
+ (define symmetric_difference
+ (lambda (self x)
+ (union (difference self x) (difference x self))))
+
+ (define symmetric_difference_update
+ (lambda (self x)
+ (difference_update self x)
+ (update self (difference x self))))
+
+ (define union
+ (lambda (self . l)
+ (let* ((d (slot-ref self 'dict))
+ (r (pyhash-copy d)))
+ (let lp ((l l))
+ (if (pair? l)
+ (begin
+ (for ((k : (car l))) ()
+ (pylist-set! r k #t))
+ (lp (cdr l)))
+ r)))))
+
+ (define update
+ (lambda (self . l)
+ (let* ((r (slot-ref self 'dict)))
+ (let lp ((l l))
+ (if (pair? l)
+ (begin
+ (for ((k : (car l))) ()
+ (pylist-set! r k #t))
+ (lp (cdr l)))
+ (values))))))
+
+ (define __repr__(self):
+ (let ((r (py-keys (slot-ref self 'dicy)))
+ (n (len r))
+ (l (to-list r)))
+ (cond
+ ((= n 0)
+ (format #f "set([])"))
+ (else
+ (format #f "set([~a ~{, ~a~}])" (car l) (cdr l))))))
+
+ (define __iter__
+ (make-generator (self)
+ (lambda (yield self)
+ (for ((k : (slot-ref self 'dict))) ()
+ (yield k)
+ (values))))))
+
+
+
+