Skip to content

Commit 05db2f8

Browse files
committed
fix deque __add__, __iadd__, __mul__, __rmul__ and __imul__
1 parent 3be5794 commit 05db2f8

File tree

2 files changed

+40
-14
lines changed

2 files changed

+40
-14
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_deque.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -219,9 +219,6 @@ def test_add(self):
219219
self.assertEqual(e + e, deque('abcabc'))
220220
self.assertEqual(e + d, deque('abc'))
221221
self.assertEqual(d + e, deque('abc'))
222-
self.assertIsNot(d + d, deque())
223-
self.assertIsNot(e + d, deque('abc'))
224-
self.assertIsNot(d + e, deque('abc'))
225222

226223
g = deque('abcdef', maxlen=4)
227224
h = deque('gh')
@@ -375,7 +372,6 @@ def test_mul(self):
375372
self.assertEqual(d * 1, deque('abc'))
376373
self.assertEqual(d * 2, deque('abcabc'))
377374
self.assertEqual(d * 3, deque('abcabcabc'))
378-
self.assertIsNot(d * 1, d)
379375

380376
self.assertEqual(deque() * 0, deque())
381377
self.assertEqual(deque() * 1, deque())

graalpython/lib-graalpython/_collections.py

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,30 @@ class Lock(object):
5757
pass
5858

5959

60+
def _add(d1, d2):
61+
d1.extend(d2)
62+
return d1
63+
64+
65+
def _mul(d, times):
66+
if not isinstance(times, int):
67+
raise TypeError("can't multiply sequence by non-int of type '%s'" % (type(times)))
68+
if times <= 0:
69+
d.clear()
70+
else:
71+
l = list(d)
72+
for _ in range(times - 1):
73+
d.extend(l)
74+
return d
75+
76+
77+
def _next_or_none(_iter):
78+
try:
79+
return next(_iter)
80+
except StopIteration:
81+
return None
82+
83+
6084
class deque(object):
6185
def __init__(self, iterable=None, maxlen=None):
6286
if maxlen is None:
@@ -193,9 +217,22 @@ def extend(self, iterable):
193217
break
194218
self.append(obj)
195219

196-
def __iadd__(self, iterable):
197-
self.extend(iterable)
198-
return self
220+
def __iadd__(self, other):
221+
return _add(self, other)
222+
223+
def __add__(self, other):
224+
if not isinstance(other, deque):
225+
raise TypeError("can only concatenate deque (not '%s') to deque" % (type(other)))
226+
return _add(deque(self, maxlen=self.maxlen), other)
227+
228+
def __imul__(self, times):
229+
return _mul(self, times)
230+
231+
def __mul__(self, times):
232+
return _mul(deque(self, maxlen=self.maxlen), times)
233+
234+
def __rmul__(self, times):
235+
return _mul(deque(self, maxlen=self.maxlen), times)
199236

200237
def extendleft(self, iterable):
201238
"""Extend the left side of the deque with elements from the iterable"""
@@ -441,13 +478,6 @@ def maxlen(self):
441478
return self._maxlen
442479

443480

444-
def _next_or_none(_iter):
445-
try:
446-
return next(_iter)
447-
except StopIteration:
448-
return None
449-
450-
451481
class _DequeIter(object):
452482
def __init__(self, dq):
453483
self._deque = dq

0 commit comments

Comments
 (0)