summaryrefslogtreecommitdiff
path: root/modules/language/python/module
diff options
context:
space:
mode:
Diffstat (limited to 'modules/language/python/module')
-rw-r--r--modules/language/python/module/collections.scm107
1 files changed, 97 insertions, 10 deletions
diff --git a/modules/language/python/module/collections.scm b/modules/language/python/module/collections.scm
index 9f40220..393877b 100644
--- a/modules/language/python/module/collections.scm
+++ b/modules/language/python/module/collections.scm
@@ -32,7 +32,7 @@
MappingView ItemsView KeysView ValuesView)
#:export (OrderedDict ChainMap Counter UserDict UserString UserList
- namedtuple defaultdict dequeue))
+ namedtuple defaultdict deque))
#|
* namedtuple factory function for creating tuple subclasses with named fields
@@ -710,7 +710,7 @@
(raise KeyError (format #f "key ~a is missing" key))
(pylist-ref d key))))))
-(define-python-class dequeue ()
+(define-python-class deque ()
(define __init__
(lambda* (self #:optional (iterable '()) (maxlen None))
(let ((head (link)))
@@ -941,15 +941,102 @@
(if (not (eq? p h))
(begin
(yield (get-key p))
- (lp (get-prev p))))))))))))
+ (lp (get-prev p)))))))))))
+ (define __contains__
+ (lambda (self x)
+ (try
+ (lambda ()
+ (if ((ref self 'index) x)
+ #t
+ #f))
+ (#:except IndexError =>
+ (lambda x #f)))))
-
-
+ (define __len__
+ (lambda (self)
+ (ref self '_i)))
+
+ (define __getitem__
+ (lambda (self i)
+ (let ((n (ref self '_i)))
+ (if (or (>= i n) (< i 0))
+ (raise IndexError i))
+ (let lp ((p (get-next (ref self '_head))) (j 0))
+ (if (= i j)
+ (get-key p)
+ (lp (get-next p) (+ j 1)))))))
+
+ (define __setitem__
+ (lambda (self i v)
+ (let ((n (ref self '_i)))
+ (if (or (>= i n) (< i 0))
+ (raise IndexError i))
+ (let lp ((p (get-next (ref self '_head))) (j 0))
+ (if (= i j)
+ (set-key! p v)
+ (lp (get-next p) (+ j 1)))))))
+
+ (define __delitem__
+ (lambda (self i)
+ (let ((n (ref self '_i)))
+ (if (or (>= i n) (< i 0))
+ (raise IndexError i))
+ (let lp ((p (get-next (ref self '_head))) (j 0))
+ (if (= i j)
+ (let ((prev (get-prev p))
+ (next (get-next p)))
+ (set-next! prev next)
+ (set-prev! next prev)
+ (set self '_i (- n 1)))
+ (lp (get-next p) (+ j 1)))))))
-
-
-
-
-
+ (define __repr__
+ (lambda (self)
+ (let ((l (to-list self)))
+ (if (pair? l)
+ (format #f "deque([~a~{, ~a~}])" (car l) (cdr l))
+ "deque([])"))))
+
+ (define __add__
+ (lambda (self iter)
+ (let ((o ((ref self 'copy))))
+ (let ((f (ref o 'append)))
+ (for ((x : iter)) ()
+ (f x)))
+ o)))
+
+ (define __iadd__
+ (lambda (self iter)
+ (let ((o self))
+ (let ((f (ref o 'append)))
+ (for ((x : iter)) ()
+ (f x)))
+ o)))
+
+ (define __mul__
+ (lambda (self n)
+ (let ((o (dequeue)))
+ (let ((f (ref o 'append)))
+ (let lp ((i 0))
+ (if (< i n)
+ (begin
+ (for ((x : self)) ()
+ (f x))
+ (lp (+ i 1)))
+ o))))))
+
+ (define __imul__
+ (lambda (self n)
+ (if (= n 0)
+ ((ref self 'clear))
+ (let ((o self))
+ (let ((f (ref o 'append)))
+ (let lp ((i 1))
+ (if (< i n)
+ (begin
+ (for ((x : self)) ()
+ (f x))
+ (lp (+ i 1)))
+ o))))))))