|
1 | 1 | use derive_new::new; |
2 | 2 | use educe::Educe; |
3 | | -use replace_with::replace_with_or_abort; |
| 3 | +use replace_with::{replace_with, replace_with_or_abort}; |
4 | 4 | use serde::{Deserialize, Serialize}; |
5 | | -use std::{iter, marker::PhantomData, mem}; |
| 5 | +use std::{iter, marker::PhantomData}; |
6 | 6 |
|
7 | 7 | use super::{folder_par_sink, FolderSync, FolderSyncReducer, ParallelPipe, ParallelSink}; |
8 | 8 |
|
@@ -44,14 +44,15 @@ where |
44 | 44 |
|
45 | 45 | #[inline(always)] |
46 | 46 | fn zero(&mut self) -> Self::Done { |
47 | | - iter::empty::<B>().sum() |
| 47 | + B::sum(iter::empty::<B>()) |
48 | 48 | } |
49 | 49 | #[inline(always)] |
50 | | - fn push(&mut self, state: &mut Self::State, item: Item) { |
51 | | - let zero = iter::empty::<B>().sum(); |
52 | | - let left = mem::replace(state, zero); |
53 | | - let right = iter::once(item).sum::<B>(); |
54 | | - *state = B::sum(iter::once(left).chain(iter::once(right))); |
| 50 | + fn push(&mut self, state: &mut Self::Done, item: Item) { |
| 51 | + let default = || B::sum(iter::empty::<B>()); |
| 52 | + replace_with(state, default, |left| { |
| 53 | + let right = iter::once(item).sum::<B>(); |
| 54 | + B::sum(iter::once(left).chain(iter::once(right))) |
| 55 | + }) |
55 | 56 | } |
56 | 57 |
|
57 | 58 | #[inline(always)] |
@@ -79,11 +80,11 @@ where |
79 | 80 | type Done = Self::State; |
80 | 81 |
|
81 | 82 | #[inline(always)] |
82 | | - fn zero(&mut self) -> Self::State { |
| 83 | + fn zero(&mut self) -> Self::Done { |
83 | 84 | self.zero.take().unwrap() |
84 | 85 | } |
85 | 86 | #[inline(always)] |
86 | | - fn push(&mut self, state: &mut Self::State, item: Item) { |
| 87 | + fn push(&mut self, state: &mut Self::Done, item: Item) { |
87 | 88 | replace_with_or_abort(state, |left| { |
88 | 89 | let right = iter::once(item).sum::<Option<Item>>().unwrap(); |
89 | 90 | <Option<Item> as iter::Sum<Item>>::sum(iter::once(left).chain(iter::once(right))) |
|
0 commit comments