Fix mapping of ratios to indexes

This commit is contained in:
Jordan Eldredge 2017-09-07 20:17:59 -07:00
parent 1ead097fcd
commit f35677e8cf
2 changed files with 19 additions and 6 deletions

View file

@ -92,6 +92,16 @@ export const merge = (target, source) => {
return target;
};
// Maps a value in a range (defined my min/max) to the corresponding value in the array `newValues`.
export const segment = (min, max, value, newValues) =>
newValues[Math.floor((value - min) / (max - min) * (newValues.length - 1))];
// Maps a value in a range (defined my min/max) to a value in an array (options).
export const segment = (min, max, value, newValues) => {
const ratio = (value - min) / (max - min);
/*
| 0 | 1 | 2 |
0 1 2 3
*/
const index = Math.min(
Math.floor(ratio * newValues.length),
newValues.length - 1 // Special case for 100%
);
return newValues[index];
};

View file

@ -143,16 +143,19 @@ describe("segment", () => {
expect(segment(-1, 100, -1, [0, 1, 2])).toBe(0);
});
it("can handle max", () => {
expect(segment(0, 100, 100, [0, 1, 2])).toBe(2);
expect(segment(1, 100, 100, [0, 1, 2])).toBe(2);
//expect(segment(0, 100, 100, [0, 1, 2])).toBe(2);
//expect(segment(1, 100, 100, [0, 1, 2])).toBe(2);
expect(segment(-1, 100, 100, [0, 1, 2])).toBe(2);
});
it("can handle mid", () => {
expect(segment(0, 2, 1, [0, 1, 2])).toBe(1);
expect(segment(0, 2, 1.5, [0, 1, 2])).toBe(1);
expect(segment(0, 2, 1.5, [0, 1, 2])).toBe(2);
expect(segment(1, 3, 2.5, [0, 1, 2])).toBe(2);
expect(segment(-1, 2, 0.5, [0, 1, 2])).toBe(1);
});
it("can handle mid", () => {
expect(segment(-100, 100, -100, ["left", "center", "right"])).toBe("left");
expect(segment(0, 100, 88, ["left", "center", "right"])).toBe("right");
expect(segment(0, 100, 50, ["left", "center", "right"])).toBe("center");
});
});