Skip to content

Instantly share code, notes, and snippets.

@Announcement
Created April 2, 2019 01:38
Show Gist options
  • Save Announcement/28d2e03339c37ca7e7b8cc347ac13772 to your computer and use it in GitHub Desktop.
Save Announcement/28d2e03339c37ca7e7b8cc347ac13772 to your computer and use it in GitHub Desktop.
function formula_xfyz (x: string | symbol, y: string | symbol, z: string | symbol, f: '+' | '-' | '*' | '/' | '^') {
// function fn (it: { [x]: number, [y]: number }): { [z]: number};
// function fn (it: { [x]: number, [z]: number }): { [y]: number};
// function fn (it: { [y]: number, [z]: number }): { [x]: number};
function fn (it: any): any {
const g = ({
'+': [ (x: number, y: number): number /* z */ => x + y,
(x: number, z: number): number /* y */ => z - x,
(y: number, z: number): number /* x */ => z - y ],
'-': [ (x: number, y: number): number /* z */ => x - y,
(x: number, z: number): number /* y */ => x - z,
(y: number, z: number): number /* x */ => z + y ],
'*': [ (x: number, y: number): number /* z */ => x * y,
(x: number, z: number): number /* y */ => z / x,
(y: number, z: number): number /* x */ => z / y ],
'/': [ (x: number, y: number): number /* z */ => x / y,
(x: number, z: number): number /* y */ => x / z,
(y: number, z: number): number /* x */ => z * y ],
'^': [ (x: number, y: number): number /* z */ => x ** y,
(x: number, z: number): number /* y */ => Math.log(z) / Math.log(x),
(y: number, z: number): number /* x */ => z ** (1 / y) ],
})[f];
if (it.hasOwnProperty(x)) {
if (it.hasOwnProperty(y)) return (x: number, y: number) => ({ [z]: g[0](x, y) });
if (it.hasOwnProperty(z)) return (x: number, z: number) => ({ [y]: g[1](x, z) });
}
if (it.hasOwnProperty(y)) {
if (it.hasOwnProperty(x)) return (x: number, y: number) => ({ [z]: g[0](x, y) });
if (it.hasOwnProperty(z)) return (y: number, z: number) => ({ [x]: g[2](y, z) });
}
if (it.hasOwnProperty(z)) {
if (it.hasOwnProperty(x)) return (x: number, z: number) => ({ [y]: g[1](x, z) });
if (it.hasOwnProperty(y)) return (y: number, z: number) => ({ [x]: g[2](y, z) });
}
}
return fn;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment