From f1ece70a475098fb01aa0e4983b0b0cbb1f8fb58 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Mar 2026 23:03:47 +0000 Subject: [PATCH 1/2] Initial plan From 2da6f5935d4f27a46f584fb179858600633ca35b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Mar 2026 23:07:55 +0000 Subject: [PATCH 2/2] refactor: use fold for aggregation in get_positions Co-authored-by: gemcoder21 <104884878+gemcoder21@users.noreply.github.com> --- .../gem_hypercore/src/provider/perpetual.rs | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/crates/gem_hypercore/src/provider/perpetual.rs b/crates/gem_hypercore/src/provider/perpetual.rs index 80960d171..ebb9add80 100644 --- a/crates/gem_hypercore/src/provider/perpetual.rs +++ b/crates/gem_hypercore/src/provider/perpetual.rs @@ -61,18 +61,16 @@ impl ChainPerpetual for HyperCoreClient { let requests: Vec<_> = dex_entries.iter().map(|(_, dex)| self.fetch_positions_for_dex(address.clone(), dex.clone())).collect(); let summaries = try_join_all(requests).await?; - let mut positions = Vec::new(); - let mut balance = PerpetualBalance { - available: 0.0, - reserved: 0.0, - withdrawable: 0.0, - }; - for summary in summaries { - positions.extend(summary.positions); - balance.available += summary.balance.available; - balance.reserved += summary.balance.reserved; - balance.withdrawable += summary.balance.withdrawable; - } + let (positions, balance) = summaries.into_iter().fold( + (Vec::new(), PerpetualBalance { available: 0.0, reserved: 0.0, withdrawable: 0.0 }), + |(mut acc_pos, mut acc_bal), summary| { + acc_pos.extend(summary.positions); + acc_bal.available += summary.balance.available; + acc_bal.reserved += summary.balance.reserved; + acc_bal.withdrawable += summary.balance.withdrawable; + (acc_pos, acc_bal) + }, + ); Ok(PerpetualPositionsSummary { positions, balance }) }