Skip to content

Optimize calculateFreebuffStreak to single-pass iteration - #1260

Open
pavankumar-vh wants to merge 1 commit into
CodebuffAI:mainfrom
pavankumar-vh:fix/calculate-streak-single-loop
Open

Optimize calculateFreebuffStreak to single-pass iteration#1260
pavankumar-vh wants to merge 1 commit into
CodebuffAI:mainfrom
pavankumar-vh:fix/calculate-streak-single-loop

Conversation

@pavankumar-vh

Copy link
Copy Markdown

Overview

Optimize the calculateFreebuffStreak function in common/src/util/freebuff-streak.ts to use a single pass instead of two iterations.

Bug Description

The function iterated through usageDates twice:

  1. Once with filter() to build the usageDateSet
  2. Once with reduce() to find lastUsageDate

This is O(2n) when it could be O(n) by combining both operations in a single loop.

Fix

Combined both operations into one loop, building the set and tracking the latest date simultaneously. This is more efficient and clearer in intent.

Testing

All existing tests pass (14/14).

Files Changed

  • common/src/util/freebuff-streak.ts - Single-pass iteration optimization

Scope

This change only touches common/src/util/freebuff-streak.ts (a single file in the approved common/ area).

The function iterated through usageDates twice:
1. Once with filter() to build the usageDateSet
2. Once with reduce() to find lastUsageDate

This is O(2n) when it could be O(n) by combining both operations in a single loop.

Combined both operations into one loop, building the set and tracking the latest
date simultaneously. This is more efficient and clearer in intent.
@codebuff-team

Copy link
Copy Markdown
Contributor

Good, minimal change. Combining the filter+reduce into a single for loop is a correct, low-risk optimization — the semantics are preserved exactly (dates > todayDateKey are skipped for both the set and lastUsageDate, and lastUsageDate tracking logic matches the original reduce behavior). Scope is appropriately narrow, touching only common/src/util/freebuff-streak.ts.

A couple of minor notes for next time:

  • The perf gain here is negligible in practice (usageDates is presumably a small, bounded list of recent days), so the value of this PR is more about clarity/idiom than actual performance. That's fine, but framing it as an optimization with O(2n)->O(n) claims is a bit oversold for what's really a readability tweak.
  • No new test was added to lock in the refactor, though the existing 14 tests passing is reasonable confirmation for a pure refactor like this.

Overall this is a clean, easy-to-review change that a maintainer could port by hand with minimal effort. Nice first contribution.

@codebuff-team codebuff-team added bot:triaged Classified by the community triage bot pr:port-candidate Worth porting into the private source tree labels Sep 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bot:triaged Classified by the community triage bot pr:port-candidate Worth porting into the private source tree

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants