master
Freywar Ulvnaudgari 2 years ago
parent bbaa58a0b8
commit f19b0ebf01
  1. 8
      src/num.ts
  2. 54
      test/num.spec.ts

@ -1,6 +1,6 @@
import { toNative as $$, L, P, _, fromNative as __, id } from './core'; import { toNative as $$, L, P, _, fromNative as __, id } from './core';
import { EQ, GT, LT, Ord } from './ord'; import { EQ, GT, LT, Ord } from './ord';
import { Bool, False, True } from './bool'; import { Bool, False, iif, True } from './bool';
export type Num = L<<T extends P>(z: T) => L<(n: L<(p: Num) => T>) => T>>; export type Num = L<<T extends P>(z: T) => L<(n: L<(p: Num) => T>) => T>>;
@ -52,6 +52,12 @@ export const sub: L<(l: Num) => L<(r: Num) => Num>>
export const mul: L<(l: Num) => L<(r: Num) => Num>> export const mul: L<(l: Num) => L<(r: Num) => Num>>
= _(l => _(r => l._(Zero)._(_(pl => sum._(r)._(mul._(pl)._(r)))))); = _(l => _(r => l._(Zero)._(_(pl => sum._(r)._(mul._(pl)._(r))))));
export const div: L<(l: Num) => L<(r: Num) => Num>>
= _(l => _(r => iif._(lt._(l)._(r))._(Zero)._(succ._(div._(sub._(l)._(r))._(r)))));
export const mod: L<(l: Num) => L<(r: Num) => Num>>
= _(l => _(r => iif._(lt._(l)._(r))._(l)._(mod._(sub._(l)._(r))._(r))));
export const fromNumber: (n: number) => Num export const fromNumber: (n: number) => Num
= n => !n ? Zero : Succ._(new L(() => fromNumber(n - 1).value)); = n => !n ? Zero : Succ._(new L(() => fromNumber(n - 1).value));

@ -2,7 +2,7 @@ import { describe, expect, it } from '@jest/globals';
import { L, undef } from '../src/core'; import { L, undef } from '../src/core';
import { toNOrd as $o, NOrd } from '../src/ord'; import { toNOrd as $o, NOrd } from '../src/ord';
import { toBoolean as $b, fromBoolean as _b } from '../src/bool'; import { toBoolean as $b, fromBoolean as _b } from '../src/bool';
import { toNumber as $, Num, Succ, Zero, fromNumber as _, cmp, eq, ge, gt, ifz, le, lt, mul, pred, sub, succ, sum } from '../src/num'; import { toNumber as $, Num, Succ, Zero, fromNumber as _, cmp, div, eq, ge, gt, ifz, le, lt, mod, mul, pred, sub, succ, sum } from '../src/num';
describe('Num', () => { describe('Num', () => {
const infinity: Num = new L(() => Succ._(infinity).value); const infinity: Num = new L(() => Succ._(infinity).value);
@ -332,4 +332,56 @@ describe('Num', () => {
expect($(mul._(_(0))._(undef))).toBe(0); expect($(mul._(_(0))._(undef))).toBe(0);
}); });
}); });
describe('div', () => {
it('0 div 10 is 0', () => {
expect($(div._(_(0))._(_(10)))).toBe(0);
});
it('1 div 10 is 0', () => {
expect($(div._(_(1))._(_(10)))).toBe(0);
});
it('10 div 1 is 10', () => {
expect($(div._(_(10))._(_(1)))).toBe(10);
});
it('10 div 5 is 2', () => {
expect($(div._(_(10))._(_(5)))).toBe(2);
});
it('10 div 3 is 3', () => {
expect($(div._(_(10))._(_(3)))).toBe(3);
});
it.failing('0 div ignores second argument', () => {
expect($(div._(_(0))._(undef))).toBe(0);
});
});
describe('mod', () => {
it('0 mod 10 is 0', () => {
expect($(mod._(_(0))._(_(10)))).toBe(0);
});
it('1 mod 10 is 1', () => {
expect($(mod._(_(1))._(_(10)))).toBe(1);
});
it('10 mod 1 is 0', () => {
expect($(mod._(_(10))._(_(1)))).toBe(0);
});
it('10 mod 5 is 0', () => {
expect($(mod._(_(10))._(_(5)))).toBe(0);
});
it('10 mod 3 is 1', () => {
expect($(mod._(_(10))._(_(3)))).toBe(1);
});
it.failing('0 mod ignores second argument', () => {
expect($(mod._(_(0))._(undef))).toBe(0);
});
});
}); });

Loading…
Cancel
Save