Skip to content

Commit

Permalink
add mean
Browse files Browse the repository at this point in the history
  • Loading branch information
Symmetronic committed Mar 13, 2021
1 parent 145081a commit 115642c
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 7 deletions.
35 changes: 29 additions & 6 deletions src/min-max-range.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import {
isNumber,
map,
max as maxOfArray,
mean as meanOfArray,
min as minOfArray,
pipe,
ret,
Expand All @@ -42,7 +43,7 @@ import {
export function bottomLeft(range: Range2D): Coordinates {
return pipe(
asRange2D,
(range: Range2D) => [min(range[0]), min(range[1])],
(range: Range2D) => [asNumber(min(range[0])), asNumber(min(range[1]))],
)(range);
}

Expand All @@ -54,7 +55,7 @@ export function bottomLeft(range: Range2D): Coordinates {
export function bottomRight(range: Range2D): Coordinates {
return pipe(
asRange2D,
(range: Range2D) => [max(range[0]), min(range[1])],
(range: Range2D) => [asNumber(max(range[0])), asNumber(min(range[1]))],
)(range);
}

Expand All @@ -69,7 +70,7 @@ export function first(range: Range): undefined | number | number[] {
alternative(
pipe(
asRange1D,
(range: Range1D) => range[0],
(range: Range1D) => asNumber(range[0]),
),
pipe(
asMultiDimRange,
Expand Down Expand Up @@ -139,7 +140,7 @@ export function last(range: Range): undefined | number | number[] {
alternative(
pipe(
asRange1D,
(range: Range1D) => range[1],
(range: Range1D) => asNumber(range[1]),
),
pipe(
asMultiDimRange,
Expand Down Expand Up @@ -194,6 +195,28 @@ export function max(range: Range): undefined | number | number[] {
)(range);
}

/**
* Return mean of each dimension of a range.
* @param range The range.
* @returns Mean of each dimension of the range.
*/
export function mean(range: Range): undefined | number | number[] {
return pipe(
asRange,
alternative(
pipe(
asRange1D,
meanOfArray,
),
pipe(
asMultiDimRange,
map((el: Range1D) => asNumber(mean(el))),
),
ret(undefined),
),
)(range);
}

/**
* Return minimum value of each dimension of a range.
* @param range The range.
Expand Down Expand Up @@ -227,7 +250,7 @@ export function reverse(range: Range): Range {
alternative(
pipe(
asRange1D,
(range: Range1D) => [last(range), first(range)],
(range: Range1D) => [asNumber(last(range)), asNumber(first(range))],
),
pipe(
asMultiDimRange,
Expand All @@ -250,7 +273,7 @@ export function sort(range: Range): Range {
alternative(
pipe(
asRange1D,
(range: Range1D) => [min(range), max(range)],
(range: Range1D) => [asNumber(min(range)), asNumber(max(range))],
),
pipe(
asMultiDimRange,
Expand Down
18 changes: 18 additions & 0 deletions src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,15 @@ export function max(values: number[]): number {
return Math.max(...values);
}

/**
* Return mean of values.
* @param values Array of numbers.
* @returns Mean value.
*/
export function mean(values: number[]): number {
return sum(values) / values.length;
}

/**
* Return minimum value of array of numbers.
* @param values Array of numbers.
Expand Down Expand Up @@ -214,3 +223,12 @@ export function pipe(...transforms: Transform[]): Transform {
export function ret<T>(value: T): () => T {
return () => value;
}

/**
* Return sum of values.
* @param values Array of numbers
* @returns The sum.
*/
export function sum(values: number[]): number {
return values.reduce((sum, value) => sum + value, 0);
}
26 changes: 26 additions & 0 deletions test/min-max-range.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
last,
length,
max,
mean,
min,
reverse,
sort,
Expand Down Expand Up @@ -258,6 +259,31 @@ describe('min-max-range', () => {
});
});

describe('mean', () => {
it('throws an error if input is no range', () => {
for (const INVALID_RANGE of INVALID_RANGES) {
expect(() => {
mean(INVALID_RANGE);
}).toThrowError();
}
});

it('returns undefined for empty range', () => {
expect(mean(EMPTY_RANGE)).toBe(undefined);
});

it('returns arithmetic mean of one-dimensional range', () => {
expect(mean(RANGE_1D)).toBe((RANGE_1D[0] + RANGE_1D[1]) / 2);
});

it('returns arithmetic mean of multi-dimensional range', () => {
for (const MULTI_DIM_RANGE of MULTI_DIM_RANGES) {
expect(mean(MULTI_DIM_RANGE))
.toEqual(MULTI_DIM_RANGE.map(r => (r[0] + r[1]) / 2));
}
});
});

describe('min', () => {
it('throws an error if input is no range', () => {
for (const INVALID_RANGE of INVALID_RANGES) {
Expand Down
16 changes: 15 additions & 1 deletion test/utils.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,11 @@ import {
isNumber,
map,
max,
mean,
min,
pipe,
ret,
sum,
Transform,
} from '../src/utils';

Expand Down Expand Up @@ -261,8 +263,14 @@ describe('utils', () => {
});
});

describe('mean', () => {
it('returns the arithmetic mean of an array of numbers', () => {
expect(mean([4, 0, -6, 3])).toBe(0.25);
});
});

describe('min', () => {
it('returns the minimum value of an array of number', () => {
it('returns the minimum value of an array of numbers', () => {
expect(min([-3, 5, 0, -12])).toBe(-12);
});
});
Expand All @@ -287,4 +295,10 @@ describe('utils', () => {
expect(returner()).toBe(42);
});
});

describe('sum', () => {
it('returns the sum of an array of numbers', () => {
expect(sum([-2, 4, -8, 16, -32, 64])).toBe(42);
});
});
});

0 comments on commit 115642c

Please sign in to comment.