From 1f86ca7767d661a42b3e66f667bb044f9c861346 Mon Sep 17 00:00:00 2001 From: Stefan Israelsson Tampe Date: Thu, 22 Mar 2018 10:40:03 +0100 Subject: bisect module --- modules/language/python/module/collections.scm | 107 ++++++++++++++++++++++--- 1 file changed, 97 insertions(+), 10 deletions(-) (limited to 'modules/language/python/module') 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)))))))) -- cgit v1.2.3