Skip to content

Commit

Permalink
feat: improve function average, support object item
Browse files Browse the repository at this point in the history
  • Loading branch information
GreatAuk committed May 10, 2024
1 parent adf6060 commit e7a5548
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 7 deletions.
7 changes: 4 additions & 3 deletions packages/core/src/math.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@ describe('math functions', () => {
expect(toFixedWithoutZeros(1.005, 2)).toBe('1')
})
it('average', () => {
expect(average(1, 2, 3)).toBe(2)
expect(average(...[1, 2, 3])).toBe(2)
expect(average(...[])).toBe(NaN)
expect(average([1, 2, 3])).toBe(2)
expect(average([1, 3])).toBe(2)
expect(average([])).toBe(NaN)
expect(average([{ value: 1 }, { value: 2 }], item => item.value)).toBe(1.5)
})
it('sum', () => {
expect(sum([1, 2, 3])).toBe(6)
Expand Down
17 changes: 13 additions & 4 deletions packages/core/src/math.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,22 @@ export function toFixedWithoutZeros(num: number, precision: number): string {
* get the average of all the numbers passed in
* @example
* ```ts
* average(1, 2, 3) // 2
* average(...[1, 2, 3]) // 2
* average([1, 2, 3]) // 2
* average([]) // NaN
* average([{ value: 1 }, { value: 2 }], item => item.value) // 1.5
* ```
* @linkcode https://github.com/GreatAuk/utopia-utils/blob/main/packages/core/src/math.ts
*/
export function average(...args: number[]): number {
return args.reduce((a, b) => a + b, 0) / args.length
export function average<T extends number>(arr: readonly T[]): number
export function average<T extends object>(
arr: readonly T[],
fn: (item: T) => number
): number
export function average<T extends object | number>(
arr: readonly any[],
fn?: (item: T) => number,
): number {
return arr.reduce((acc, item) => acc + (fn ? fn(item) : item), 0) / arr.length
}

/**
Expand Down

0 comments on commit e7a5548

Please sign in to comment.