Skip to content

Commit

Permalink
feat: improve function sum, support object item
Browse files Browse the repository at this point in the history
  • Loading branch information
GreatAuk committed May 10, 2024
1 parent 13af4ad commit adf6060
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 9 deletions.
13 changes: 9 additions & 4 deletions packages/core/src/math.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { average, toFixedWithoutZeros, sum } from './math'
import { average, sum, toFixedWithoutZeros } from './math'

describe('math functions', () => {
it('toFixedWithoutZeros', () => {
Expand All @@ -12,8 +12,13 @@ describe('math functions', () => {
expect(average(...[])).toBe(NaN)
})
it('sum', () => {
expect(sum(1, 2, 3)).toBe(6)
expect(sum(1, 2, 3, 4)).toBe(10)
expect(sum(...[])).toBe(0)
expect(sum([1, 2, 3])).toBe(6)
expect(sum([1, 2, 3, 4])).toBe(10)
expect(sum([])).toBe(0)
expect(sum([
{ value: 1 },
{ value: 2 },
{ value: 3 },
], item => item.value)).toBe(6)
})
})
16 changes: 11 additions & 5 deletions packages/core/src/math.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,20 @@ export function average(...args: number[]): number {

/**
* Calculates the sum of the given numbers.
* @param args - The numbers to be summed.
* @param arr - The numbers to be summed.
* @returns The sum of the numbers.
* @example
* ```ts
* sum(1, 2, 3) // 6
* sum(1, 2, 3, 4) // 10
* sum([1, 2, 3]) // 6
* sum([]) // 0
* sum([{ value: 1 }, { value: 2 }], item => item.value) // 3
* ```
*/
export function sum(...args: number[]): number {
return args.reduce((a, b) => a + b, 0)
export function sum<T extends number>(arr: readonly T[]): number
export function sum<T extends object>(
arr: readonly T[],
fn: (item: T) => number
): number
export function sum<T extends object | number>(arr: readonly any[], fn?: (item: T) => number): number {
return (arr || []).reduce((acc, item) => acc + (fn ? fn(item) : item), 0)
}

0 comments on commit adf6060

Please sign in to comment.