diff options
Diffstat (limited to 'modules/language/python/set.scm')
-rw-r--r-- | modules/language/python/set.scm | 206 |
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)))))) + + + + |