Skip to content

Commit cd53348

Browse files
committed
fixes for accumulate
1 parent 512a7e4 commit cd53348

File tree

1 file changed

+26
-4
lines changed

1 file changed

+26
-4
lines changed

graalpython/lib-graalpython/itertools.py

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -527,29 +527,51 @@ class accumulate(object):
527527
528528
Return series of accumulated sums."""
529529

530+
_marker = object()
531+
530532
@__graalpython__.builtin_method
531-
def __init__(self, iterable, func=None):
533+
def __init__(self, iterable, func=None, *, initial=None):
532534
self.iterable = iter(iterable)
533535
self.func = func
534-
self.total = None
536+
self.total = accumulate._marker
537+
self.initial = initial
535538

536539
@__graalpython__.builtin_method
537540
def __iter__(self):
538541
return self
539542

540543
@__graalpython__.builtin_method
541544
def __next__(self):
545+
if self.initial is not None:
546+
self.total = self.initial
547+
self.initial = None
548+
return self.total
542549
value = next(self.iterable)
543-
if self.total is None:
550+
if self.total is accumulate._marker:
544551
self.total = value
545552
return value
546553

547554
if self.func is None:
548-
self.total += value
555+
self.total = self.total + value
549556
else:
550557
self.total = self.func(self.total, value)
551558
return self.total
552559

560+
@__graalpython__.builtin_method
561+
def __reduce__(self):
562+
if self.initial is not None:
563+
it = chain((self.initial,), self.iterable)
564+
return type(self), (it, self.func), None
565+
elif self.total is None:
566+
it = accumulate(chain((self.total,), self.iterable), self.func)
567+
return islice, (it, 1, None)
568+
else:
569+
return type(self), (self.iterable, self.func), self.total
570+
571+
@__graalpython__.builtin_method
572+
def __setstate__(self, state):
573+
self.total = state
574+
553575

554576
class dropwhile(object):
555577
"""

0 commit comments

Comments
 (0)