@@ -542,7 +542,7 @@ impl PyItertoolsFilterFalse {
542
542
struct PyItertoolsAccumulate {
543
543
iterable : PyObjectRef ,
544
544
binop : PyObjectRef ,
545
- acc_value : RefCell < PyObjectRef > ,
545
+ acc_value : RefCell < Option < PyObjectRef > > ,
546
546
}
547
547
548
548
impl PyValue for PyItertoolsAccumulate {
@@ -566,28 +566,29 @@ impl PyItertoolsAccumulate {
566
566
Ok ( PyItertoolsAccumulate {
567
567
iterable : iter,
568
568
binop : binop. unwrap_or_else ( || vm. get_none ( ) ) ,
569
- acc_value : RefCell :: from ( vm . get_none ( ) ) ,
569
+ acc_value : RefCell :: from ( Option :: None ) ,
570
570
}
571
571
. into_ref ( vm)
572
572
. into_object ( ) )
573
573
}
574
574
575
575
#[ pymethod( name = "__next__" ) ]
576
576
fn next ( & self , vm : & VirtualMachine ) -> PyResult {
577
- let acc_value = self . acc_value . borrow ( ) . clone ( ) ;
578
577
let iterable = & self . iterable ;
579
-
580
578
let obj = call_next ( vm, iterable) ?;
581
579
582
- let next_acc_value = if acc_value. is ( & vm. get_none ( ) ) {
583
- obj. clone ( )
584
- } else if self . binop . is ( & vm. get_none ( ) ) {
585
- vm. _add ( acc_value, obj. clone ( ) ) ?
586
- } else {
587
- vm. invoke ( & self . binop , vec ! [ acc_value, obj. clone( ) ] ) ?
580
+ let next_acc_value = match & * self . acc_value . borrow ( ) {
581
+ Option :: None => obj. clone ( ) ,
582
+ Option :: Some ( value) => {
583
+ if self . binop . is ( & vm. get_none ( ) ) {
584
+ vm. _add ( value. clone ( ) , obj. clone ( ) ) ?
585
+ } else {
586
+ vm. invoke ( & self . binop , vec ! [ value. clone( ) , obj. clone( ) ] ) ?
587
+ }
588
+ }
588
589
} ;
590
+ self . acc_value . replace ( Option :: from ( next_acc_value. clone ( ) ) ) ;
589
591
590
- self . acc_value . replace ( next_acc_value. clone ( ) ) ;
591
592
Ok ( next_acc_value)
592
593
}
593
594
0 commit comments