aran
Version:
JavaScript instrumenter
477 lines (393 loc) • 15.6 kB
JavaScript
////////////
// branch //
////////////
/**
* @type {<B extends boolean, X, Y>(
* condition: B,
* x: X,
* y: Y,
* ) => B extends true ? X : Y}
*/
export const conditional = (c, x, y) => /** @type {any} */ (c ? x : y);
///////////
// guard //
///////////
/**
* @type {<X, Y>(
* guard: boolean,
* change: (main: X) => Y,
* main: X,
* ) => X | Y}
*/
export const guard = (guard, change, main) => (guard ? change(main) : main);
export const guardX = guard;
/**
* @type {<X, Y, Z1>(
* guard: boolean,
* change: (
* main: X,
* additional: Z1,
* ) => Y,
* main: X,
* additional: Z1,
* ) => X | Y}
*/
export const guardX_ = (guard, change, main, additional) =>
guard ? change(main, additional) : main;
//////////
// noop //
//////////
/** @type {() => void} */
export const noop = () => {};
/** @type {(x0: unknown) => void} */
export const noop_ = (_x0) => {};
/** @type {(x0: unknown, x1:unknown) => void} */
export const noop__ = (_x0, _x1) => {};
/** @type {(x0: unknown, x1:unknown, x2:unknown) => void} */
export const noop___ = (_x0, _x1, _x2) => {};
/** @type {(x0: unknown, x1:unknown, x2:unknown, x3:unknown) => void} */
export const noop____ = (_x0, _x1, _x2, _x3) => {};
/** @type {(x0: unknown, x1:unknown, x2:unknown, x3:unknown, x4: unknown) => void} */
export const noop_____ = (_x0, _x1, _x2, _x3, _x4) => {};
/** @type {(x0: unknown, x1:unknown, x2:unknown, x3:unknown, x4:unknown, x5:unknown) => void} */
export const noop______ = (_x0, _x1, _x2, _x3, _x4, _x5) => {};
//////////////
// Constant //
//////////////
/**
* @type {<X>(x: X) => (...rest: unknown[]) => X}
*/
export const constant = (x) => () => x;
/**
* @type {<X>(x: X) => () => X}
*/
export const constant0 = (x) => () => x;
/**
* @type {<X>(x: X) => <Y1>(y1: Y1) => X}
*/
export const constant1 = (x) => (_y1) => x;
/**
* @type {<X>(x: X) => <Y1, Y2>(y1: Y1, y2: Y2) => X}
*/
export const constant2 = (x) => (_y1, _y2) => x;
/**
* @type {<X>(x: X) => <Y1, Y2, Y3>(y1: Y1, y2: Y2, y3:Y3) => X}
*/
export const constant3 = (x) => (_y1, _y2, _y3) => x;
/**
* @type {<X>(x: X) => <Y1, Y2, Y3, Y4>(y1: Y1, y2: Y2, y3:Y3, y4:Y4) => X}
*/
export const constant4 = (x) => (_y1, _y2, _y3, _y4) => x;
/**
* @type {<X>(x: X) => <Y1, Y2, Y3, Y4, Y5>(y1: Y1, y2: Y2, y3:Y3, y4:Y4, y5:Y5) => X}
*/
export const constant5 = (x) => (_y1, _y2, _y3, _y4, _y5) => x;
/**
* @type {<X>(x: X) => <Y1, Y2, Y3, Y4, Y5, Y6>(y1: Y1, y2: Y2, y3: Y3, y4: Y4, y5: Y5, y6: Y6) => X}
*/
export const constant6 = (x) => (_y1, _y2, _y3, _y4, _y5, _y6) => x;
/**
* @type {<X>(x: X) => <Y1, Y2, Y3, Y4, Y5, Y6, Y7>(y1: Y1, y2: Y2, y3: Y3, y4: Y4, y5: Y5, y6: Y6, y7: Y7) => X}
*/
export const constant7 = (x) => (_y1, _y2, _y3, _y4, _y5, _y6, _y7) => x;
//////////
// Flip //
//////////
/**
* @type {<X1, X2, Y>(f: (x1:X1, x2:X2) => Y) => ((x2:X2, x1:X1) => Y)}
*/
export const flip$$ = (f) => (x2, x1) => f(x1, x2);
/**
* @type {<X1, X2, X3, Y>(f: (x1:X1, x2:X2, x3:X3) => Y) => ((x1:X1, x3:X3, x2:X2) => Y)}
*/
export const flip_$$ = (f) => (x1, x3, x2) => f(x1, x2, x3);
/**
* @type {<X1, X2, X3, Y>(f: (x1:X1, x2:X2, x3:X3) => Y) => ((x3:X3, x2:X2, x1:X1) => Y)}
*/
export const flip$_$ = (f) => (x3, x2, x1) => f(x1, x2, x3);
/**
* @type {<X1, X2, X3, Y>(f: (x1:X1, x2:X2, x3:X3) => Y) => ((x2:X2, x1:X1, x3:X3) => Y)}
*/
export const flip$$_ = (f) => (x2, x1, x3) => f(x1, x2, x3);
////////////
// Return //
////////////
/**
* @type {<X1>(x1: X1) => X1}
*/
export const return$ = (x1) => x1;
/**
* @type {<X1, X2>(x1: X1, x2: X2) => X1}
*/
export const return$_ = (x1, _x2) => x1;
/**
* @type {<X1, X2>(x1: X1, x2: X2) => X2}
*/
export const return_$ = (_x1, x2) => x2;
/**
* @type {<X1, X2, X3>(x1: X1, x2: X2, x3: X3) => X1}
*/
export const return$__ = (x1, _x2, _x3) => x1;
/**
* @type {<X1, X2, X3>(x1: X1, x2: X2, x3: X3) => X2}
*/
export const return_$_ = (_x1, x2, _x3) => x2;
/**
* @type {<X1, X2, X3>(x1: X1, x2: X2, x3: X3) => X3}
*/
export const return__$ = (_x1, _x2, x3) => x3;
/**
* @type {<X1, X2, X3, X4>(x1: X1, x2: X2, x3: X3, x4: X4) => X1}
*/
export const return$___ = (x1, _x2, _x3, _x4) => x1;
/**
* @type {<X1, X2, X3, X4>(x1: X1, x2: X2, x3: X3, x4: X4) => X2}
*/
export const return_$__ = (_x1, x2, _x3, _x4) => x2;
/**
* @type {<X1, X2, X3, X4>(x1: X1, x2: X2, x3: X3, x4: X4) => X3}
*/
export const return__$_ = (_x1, _x2, x3, _x4) => x3;
/**
* @type {<X1, X2, X3, X4>(x1: X1, x2: X2, x3: X3, x4: X4) => X4}
*/
export const return___$ = (_x1, _x2, _x3, x4) => x4;
/**
* @type {<X1, X2, X3, X4, X5>(x1: X1, x2: X2, x3: X3, x4: X4, x5: X5) => X1}
*/
export const return$____ = (x1, _x2, _x3, _x4, _x5) => x1;
/**
* @type {< X1, X2, X3, X4, X5>(x1: X1, x2: X2, x3: X3, x4: X4, x5: X5) => X2}
*/
export const return_$___ = (_x1, x2, _x3, _x4, _x5) => x2;
/**
* @type {<X1, X2, X3, X4, X5>(x1: X1, x2: X2, x3: X3, x4: X4, x5: X5) => X3}
*/
export const return__$__ = (_x1, _x2, x3, _x4, _x5) => x3;
/**
* @type {<X1, X2, X3, X4, X5>(x1: X1, x2: X2, x3: X3, x4: X4, x5: X5) => X4}
*/
export const return___$_ = (_x1, _x2, _x3, x4, _x5) => x4;
/**
* @type {<X1, X2, X3, X4, X5>(x1: X1, x2: X2, x3: X3, x4: X4, x5: X5) => X5}
*/
export const return____$ = (_x1, _x2, _x3, _x4, x5) => x5;
/**
* @type {<X1, X2, X3, X4, X5, X6>(x1: X1, x2: X2, x3: X3, x4: X4, x5: X5, x6: X6) => X1}
*/
export const return$_____ = (x1, _x2, _x3, _x4, _x5, _x6) => x1;
/**
* @type {<X1, X2, X3, X4, X5, X6>(x1: X1, x2: X2, x3: X3, x4: X4, x5: X5, x6: X6) => X2}
*/
export const return_$____ = (_x1, x2, _x3, _x4, _x5, _x6) => x2;
/**
* @type {<X1, X2, X3, X4, X5, X6>(x1: X1, x2: X2, x3: X3, x4: X4, x5: X5, x6: X6) => X3}
*/
export const return__$___ = (_x1, _x2, x3, _x4, _x5, _x6) => x3;
/**
* @type {<X1, X2, X3, X4, X5, X6>(x1: X1, x2: X2, x3: X3, x4: X4, x5: X5, x6: X6) => X4}
*/
export const return___$__ = (_x1, _x2, _x3, x4, _x5, _x6) => x4;
/**
* @type {<X1, X2, X3, X4, X5, X6>(x1: X1, x2: X2, x3: X3, x4: X4, x5: X5, x6: X6) => X5}
*/
export const return____$_ = (_x1, _x2, _x3, _x4, x5, _x6) => x5;
/**
* @type {<X1, X2, X3, X4, X5, X6>(x1: X1, x2: X2, x3: X3, x4: X4, x5: X5, x6: X6) => X6}
*/
export const return_____$ = (_x1, _x2, _x3, _x4, _x5, x6) => x6;
//////////
// Drop //
//////////
// export const drop_ = (f) => (x1) => f(x1);
// export const dropx = (f) => (_x1) => f();
// export const drop__ = (f) => (x1, x2) => f(x1, x2);
// export const dropx_ = (f) => (_x1, x2) => f(x2);
// export const drop_x = (f) => (x1, _x2) => f(x1);
// export const dropxx = (f) => (_x1, _x2) => f();
// export const drop___ = (f) => (x1, x2, x3) => f(x1, x2, x3);
// export const dropx__ = (f) => (_x1, x2, x3) => f(x2, x3);
// export const drop_x_ = (f) => (x1, _x2, x3) => f(x1, x3);
// export const drop__x = (f) => (x1, x2, _x3) => f(x1, x2);
// export const drop_xx = (f) => (x1, _x2, _x3) => f(x1);
// export const dropx_x = (f) => (_x1, x2, _x3) => f(x2);
// export const dropxx_ = (f) => (_x1, _x2, x3) => f(x3);
// export const dropxxx = (f) => (_x1, _x2, _x3) => f();
// export const drop_xxx = (f) => (x1, _x2, _x3, _x4) => f(x1);
// export const drop___x = (f) => (x1, x2, x3, _x4) => f(x1, x2, x3);
// export const dropx__x = (f) => (_x1, x2, x3, _x4) => f(x2, x3);
// export const dropxxx_ = (f) => (_x1, _x2, _x3, x4) => f(x4);
// export const drop_xxxx = (f) => (x1, _x2, _x3, _x4, _x5) => f(x1);
// export const dropxxx_x = (f) => (_x1, _x2, _x3, x4, _x5) => f(x4);
// export const dropxxxx_x = (f) => (_x1, _x2, _x3, _x4, x5, _x6) => f(x5);
// export const dropx__x__ = (f) => (_x1, x2, x3, _x4, x5, x6) =>
// f(x2, x3, x5, x6);
// export const dropx_x___ = (f) => (_x1, x2, _x3, x4, x5, x6) =>
// f(x2, x4, x5, x6);
// export const drop_____xx = (f) => (x1, x2, x3, x4, x5, _x6, _x7) =>
// f(x1, x2, x3, x4, x5);
// export const dropxxxxx_x = (f) => (_x1, _x2, _x3, _x4, _x5, x6, _x7) => f(x6);
//////////
// Bind //
//////////
// export const bind = (f, g) => () => f(g());
// export const bind_ = (f, g) => (x1) => f(g(x1));
// export const bind__ = (f, g) => (x1, x2) => f(g(x1, x2));
// export const bind___ = (f, g) => (x1, x2, x3) => f(g(x1, x2, x3));
// export const bind____ = (f, g) => (x1, x2, x3, x4) => f(g(x1, x2, x3, x4));
// export const bind_____ = (f, g) => (x1, x2, x3, x4, x5) =>
// f(g(x1, x2, x3, x4, x5));
// export const bind______ = (f, g) => (x1, x2, x3, x4, x5, x6) =>
// f(g(x1, x2, x3, x4, x5, x6));
/////////////
// Partial //
/////////////
/**
* @type {<X1, Y>(f: (x1: X1) => Y) => (x1: X1) => Y}
*/
export const partial_ = (f) => (x1) => f(x1);
/**
* @type {<X1, Y>(f: (x1: X1) => Y, x1: X1) => () => Y}
*/
export const partial$ = (f, x1) => () => f(x1);
/**
* @type {<X1, X2, Y>(f: (x1: X1, x2: X2) => Y) => (x1: X1, x2: X2) => Y}
*/
export const partial__ = (f) => (x1, x2) => f(x1, x2);
/**
* @type {<X1, X2, Y>(f: (x1: X1, x2: X2) => Y, x1: X1) => (x2: X2) => Y}
*/
export const partial$_ = (f, x1) => (x2) => f(x1, x2);
/**
* @type {<X1, X2, Y>(f: (x1: X1, x2: X2) => Y, x2: X2) => (x1: X1) => Y}
*/
export const partial_$ = (f, x2) => (x1) => f(x1, x2);
/**
* @type {<X1, X2, Y>(f: (x1: X1, x2: X2) => Y, x1: X1, x2: X2) => () => Y}
*/
export const partial$$ = (f, x1, x2) => () => f(x1, x2);
// export const partial___ = (f) => (x1, x2, x3) => f(x1, x2, x3);
// export const partialx__ = (f, x1) => (x2, x3) => f(x1, x2, x3);
// export const partial_x_ = (f, x2) => (x1, x3) => f(x1, x2, x3);
// export const partial__x = (f, x3) => (x1, x2) => f(x1, x2, x3);
// export const partialxx_ = (f, x1, x2) => (x3) => f(x1, x2, x3);
// export const partialx_x = (f, x1, x3) => (x2) => f(x1, x2, x3);
// export const partial_xx = (f, x2, x3) => (x1) => f(x1, x2, x3);
// export const partialxxx = (f, x1, x2, x3) => () => f(x1, x2, x3);
// export const partial____ = (f) => (x1, x2, x3, x4) => f(x1, x2, x3, x4);
// export const partialx___ = (f, x1) => (x2, x3, x4) => f(x1, x2, x3, x4);
// export const partial_x__ = (f, x2) => (x1, x3, x4) => f(x1, x2, x3, x4);
// export const partial__x_ = (f, x3) => (x1, x2, x4) => f(x1, x2, x3, x4);
// export const partial___x = (f, x4) => (x1, x2, x3) => f(x1, x2, x3, x4);
// export const partialxx__ = (f, x1, x2) => (x3, x4) => f(x1, x2, x3, x4);
// export const partialx_x_ = (f, x1, x3) => (x2, x4) => f(x1, x2, x3, x4);
// export const partialx__x = (f, x1, x4) => (x2, x3) => f(x1, x2, x3, x4);
// export const partial_xx_ = (f, x2, x3) => (x1, x4) => f(x1, x2, x3, x4);
// export const partial_x_x = (f, x2, x4) => (x1, x3) => f(x1, x2, x3, x4);
// export const partial__xx = (f, x3, x4) => (x1, x2) => f(x1, x2, x3, x4);
// export const partialxxx_ = (f, x1, x2, x3) => (x4) => f(x1, x2, x3, x4);
// export const partialxx_x = (f, x1, x2, x4) => (x3) => f(x1, x2, x3, x4);
// export const partialx_xx = (f, x1, x3, x4) => (x2) => f(x1, x2, x3, x4);
// export const partial_xxx = (f, x2, x3, x4) => (x1) => f(x1, x2, x3, x4);
// export const partialxxxx = (f, x1, x2, x3, x4) => () => f(x1, x2, x3, x4);
// export const partialxxx_x = (f, x1, x2, x3, x5) => (x4) =>
// f(x1, x2, x3, x4, x5);
// export const partialx_xxx = (f, x1, x3, x4, x5) => (x2) =>
// f(x1, x2, x3, x4, x5);
// export const partial__x_x = (f, x3, x5) => (x1, x2, x4) =>
// f(x1, x2, x3, x4, x5);
// export const partial_xx_x = (f, x2, x3, x5) => (x1, x4) =>
// f(x1, x2, x3, x4, x5);
// export const partial_xx__ = (f, x2, x3) => (x1, x4, x5) =>
// f(x1, x2, x3, x4, x5);
// export const partial__x__ = (f, x3) => (x1, x2, x4, x5) =>
// f(x1, x2, x3, x4, x5);
// export const partialxxx__ = (f, x1, x2, x3) => (x4, x5) =>
// f(x1, x2, x3, x4, x5);
// export const partialx____ = (f, x1) => (x2, x3, x4, x5) =>
// f(x1, x2, x3, x4, x5);
// export const partialxx___ = (f, x1, x2) => (x3, x4, x5) =>
// f(x1, x2, x3, x4, x5);
// export const partial_xxx_ = (f, x2, x3, x4) => (x1, x5) =>
// f(x1, x2, x3, x4, x5);
// export const partialx_____ = (f, x1) => (x2, x3, x4, x5, x6) =>
// f(x1, x2, x3, x4, x5, x6);
// export const partial__xx_x = (f, x3, x4, x6) => (x1, x2, x5) =>
// f(x1, x2, x3, x4, x5, x6);
// export const partial__x__x = (f, x3, x6) => (x1, x2, x4, x5) =>
// f(x1, x2, x3, x4, x5, x6);
// export const partial___x__ = (f, x4) => (x1, x2, x3, x5, x6) =>
// f(x1, x2, x3, x4, x5, x6);
// export const partial__x_x_ = (f, x3, x5) => (x1, x2, x4, x6) =>
// f(x1, x2, x3, x4, x5, x6);
// export const partial____xx = (f, x5, x6) => (x1, x2, x3, x4) =>
// f(x1, x2, x3, x4, x5, x6);
// export const partialxx____ = (f, x1, x2) => (x3, x4, x5, x6) =>
// f(x1, x2, x3, x4, x5, x6);
// export const partialx_x___ = (f, x1, x3) => (x2, x4, x5, x6) =>
// f(x1, x2, x3, x4, x5, x6);
// export const partialx_x___x = (f, x1, x3, x7) => (x2, x4, x5, x6) =>
// f(x1, x2, x3, x4, x5, x6, x7);
// export const partialx_x____ = (f, x1, x3) => (x2, x4, x5, x6, x7) =>
// f(x1, x2, x3, x4, x5, x6, x7);
// export const partialxxx____ = (f, x1, x2, x3) => (x4, x5, x6, x7) =>
// f(x1, x2, x3, x4, x5, x6, x7);
// export const partialx______ = (f, x1) => (x2, x3, x4, x5, x6, x7) =>
// f(x1, x2, x3, x4, x5, x6, x7);
// export const partialxx_____ = (f, x1, x2) => (x3, x4, x5, x6, x7) =>
// f(x1, x2, x3, x4, x5, x6, x7);
// export const partialxx______ = (f, x1, x2) => (x3, x4, x5, x6, x7, x8) =>
// f(x1, x2, x3, x4, x5, x6, x7, x8);
// export const partialxxx_____ = (f, x1, x2, x3) => (x4, x5, x6, x7, x8) =>
// f(x1, x2, x3, x4, x5, x6, x7, x8);
// export const partialxxx______ = (f, x1, x2, x3) => (x4, x5, x6, x7, x8, x9) =>
// f(x1, x2, x3, x4, x5, x6, x7, x8, x9);
// export const partialx__xx_x_x_ =
// (f, x1, x4, x5, x7, x9) => (x2, x3, x6, x8, x10) =>
// f(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10);
// export const partialxx_x_x_x__ =
// (f, x1, x2, x4, x6, x8) => (x3, x5, x7, x9, x10) =>
// f(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10);
// export const partialxf_ = (f, x1, f2) => (x2, x3) => f(x1, f2(x2), x3);
// export const partialxf__ = (f, x1, f2) => (x2, x3, x4) => f(x1, f2(x2), x3, x4);
// export const partialxxf__ = (f, x1, x2, f3) => (x3, x4, x5) =>
// f(x1, x2, f3(x3), x4, x5);
// export const partialxf___ = (f, x1, f2) => (x2, x3, x4, x5) =>
// f(x1, f2(x2), x3, x4, x5);
// export const partialxx_f__ = (f, x1, x2, f4) => (x3, x4, x5, x6) =>
// f(x1, x2, x3, f4(x4), x5, x6);
// export const dropFirst =
// (f) =>
// (_x, ...xs) =>
// apply(f, undefined, xs);
// export const bind =
// (f, g) =>
// (...xs) =>
// f(apply(g, undefined, xs));
// export const bind0 = (f, g) => () => f(g());
// export const bind1 = (f, g) => (x1) => f(g(x1));
// export const bind2 = (f, g) => (x1, x2) => f(g(x1, x2));
// export const bind3 = (f, g) => (x1, x2, x3) => f(g(x1, x2, x3));
// export const bind4 = (f, g) => (x1, x2, x3, x4) => f(g(x1, x2, x3, x4));
// export const bind5 = (f, g) => (x1, x2, x3, x4, x5) => f(g(x1, x2, x3, x4, x5));
// export const PARTIAL = Symbol("partial");
//
// export const partial =
// (f, ...xs) =>
// (...ys) => {
// const zs = [];
// const length1 = xs.length;
// const length2 = ys.length;
// let index2 = 0;
// for (let index1 = 0; index1 < length1; index1 += 1) {
// if (xs[index1] === PARTIAL) {
// assert(index2 < length2, "missing secondary arguments");
// zs[index1] = ys[index2];
// index2 += 1;
// } else {
// zs[index1] = xs[index1];
// }
// }
// assert(index2 === length2, "too many secondary arguments");
// return apply(f, undefined, zs);
// };