import { describe, expect, it } from '@jest/globals'; import { undef } from '../src/core'; import { toNOrd as $o, NOrd } from '../src/ord'; import { toBoolean as $b, fromBoolean as _b, cmp as bcmp, eq as beq, show as bshow, not } from '../src/bool'; import { toNumber as $n, fromNumber as _n, cmp as ncmp, eq as neq, show as nshow, succ } from '../src/num'; import { Pair, both, cmp, eq, first, fst, ge, gt, le, lt, second, show, snd } from '../src/pair'; import { toString as $s } from '../src/string'; describe('Pair', () => { describe('fst', () => { it('returns first', () => { expect($b(fst(Pair(_b(false))(_n(0))))).toBe(false); }); it('ignores second', () => { expect($b(fst(Pair(_b(false))(undef)))).toBe(false); }); }); describe('snd', () => { it('returns second', () => { expect($n(snd(Pair(_b(false))(_n(0))))).toBe(0); }); it('ignores first', () => { expect($n(snd(Pair(undef)(_n(0))))).toBe(0); }); }); describe('first', () => { it('updates first', () => { expect($b(fst(first(not)(Pair(_b(false))(_n(0)))))).toBe(true); }); it('ignores second', () => { expect($b(fst(first(not)(Pair(_b(false))(undef))))).toBe(true); }); }); describe('second', () => { it('updates second', () => { expect($n(snd(second(succ)(Pair(_b(false))(_n(0)))))).toBe(1); }); it('ignores first', () => { expect($n(snd(second(succ)(Pair(undef)(_n(0)))))).toBe(1); }); }); describe('both', () => { it('updates both', () => { expect($b(fst(both(not)(succ)(Pair(_b(false))(_n(0)))))).toBe(true); expect($n(snd(both(not)(succ)(Pair(_b(false))(_n(0)))))).toBe(1); }); }); describe('cmp', () => { it('(False, 0) cmp (False, 0) is EQ', () => { expect($o(cmp(bcmp)(ncmp)(Pair(_b(false))(_n(0)))(Pair(_b(false))(_n(0))))).toBe(NOrd.EQ); }); it('(False, 0) cmp (False, 1) is LT', () => { expect($o(cmp(bcmp)(ncmp)(Pair(_b(false))(_n(0)))(Pair(_b(false))(_n(1))))).toBe(NOrd.LT); }); it('(False, 1) cmp (False, 0) is GT', () => { expect($o(cmp(bcmp)(ncmp)(Pair(_b(false))(_n(1)))(Pair(_b(false))(_n(0))))).toBe(NOrd.GT); }); it('(False, 0) cmp (True, 0) is LT', () => { expect($o(cmp(bcmp)(ncmp)(Pair(_b(false))(_n(0)))(Pair(_b(true))(_n(0))))).toBe(NOrd.LT); }); it('(True, 0) cmp (False, 0) is GT', () => { expect($o(cmp(bcmp)(ncmp)(Pair(_b(true))(_n(0)))(Pair(_b(false))(_n(0))))).toBe(NOrd.GT); }); it('ignores second if first not equal', () => { expect($o(cmp(bcmp)(undef)(Pair(_b(false))(undef))(Pair(_b(true))(undef)))).toBe(NOrd.LT); }); }); describe('lt', () => { it('(False, 0) lt (False, 0) is False', () => { expect($b(lt(bcmp)(ncmp)(Pair(_b(false))(_n(0)))(Pair(_b(false))(_n(0))))).toBe(false); }); it('(False, 0) lt (False, 1) is True', () => { expect($b(lt(bcmp)(ncmp)(Pair(_b(false))(_n(0)))(Pair(_b(false))(_n(1))))).toBe(true); }); it('(False, 1) lt (False, 0) is False', () => { expect($b(lt(bcmp)(ncmp)(Pair(_b(false))(_n(1)))(Pair(_b(false))(_n(0))))).toBe(false); }); it('(False, 0) lt (True, 0) is True', () => { expect($b(lt(bcmp)(ncmp)(Pair(_b(false))(_n(0)))(Pair(_b(true))(_n(0))))).toBe(true); }); it('(True, 0) lt (False, 0) is False', () => { expect($b(lt(bcmp)(ncmp)(Pair(_b(true))(_n(0)))(Pair(_b(false))(_n(0))))).toBe(false); }); it('ignores second if first not equal', () => { expect($b(lt(bcmp)(undef)(Pair(_b(false))(undef))(Pair(_b(true))(undef)))).toBe(true); }); }); describe('le', () => { it('(False, 0) le (False, 0) is True', () => { expect($b(le(bcmp)(ncmp)(Pair(_b(false))(_n(0)))(Pair(_b(false))(_n(0))))).toBe(true); }); it('(False, 0) le (False, 1) is True', () => { expect($b(le(bcmp)(ncmp)(Pair(_b(false))(_n(0)))(Pair(_b(false))(_n(1))))).toBe(true); }); it('(False, 1) le (False, 0) is False', () => { expect($b(le(bcmp)(ncmp)(Pair(_b(false))(_n(1)))(Pair(_b(false))(_n(0))))).toBe(false); }); it('(False, 0) le (True, 0) is True', () => { expect($b(le(bcmp)(ncmp)(Pair(_b(false))(_n(0)))(Pair(_b(true))(_n(0))))).toBe(true); }); it('(True, 0) le (False, 0) is False', () => { expect($b(le(bcmp)(ncmp)(Pair(_b(true))(_n(0)))(Pair(_b(false))(_n(0))))).toBe(false); }); it('ignores second if first not equal', () => { expect($b(le(bcmp)(undef)(Pair(_b(false))(undef))(Pair(_b(true))(undef)))).toBe(true); }); }); describe('eq', () => { it('(False, 0) eq (False, 0) is True', () => { expect($b(eq(beq)(neq)(Pair(_b(false))(_n(0)))(Pair(_b(false))(_n(0))))).toBe(true); }); it('(False, 0) eq (False, 1) is False', () => { expect($b(eq(beq)(neq)(Pair(_b(false))(_n(0)))(Pair(_b(false))(_n(1))))).toBe(false); }); it('(False, 1) eq (False, 0) is False', () => { expect($b(eq(beq)(neq)(Pair(_b(false))(_n(1)))(Pair(_b(false))(_n(0))))).toBe(false); }); it('(False, 0) eq (True, 0) is True', () => { expect($b(eq(beq)(neq)(Pair(_b(false))(_n(0)))(Pair(_b(true))(_n(0))))).toBe(false); }); it('(True, 0) eq (False, 0) is True', () => { expect($b(eq(beq)(neq)(Pair(_b(true))(_n(0)))(Pair(_b(false))(_n(0))))).toBe(false); }); it('ignores second if first not equal', () => { expect($b(eq(beq)(undef)(Pair(_b(false))(undef))(Pair(_b(true))(undef)))).toBe(false); }); }); describe('ge', () => { it('(False, 0) ge (False, 0) is True', () => { expect($b(ge(bcmp)(ncmp)(Pair(_b(false))(_n(0)))(Pair(_b(false))(_n(0))))).toBe(true); }); it('(False, 0) ge (False, 1) is False', () => { expect($b(ge(bcmp)(ncmp)(Pair(_b(false))(_n(0)))(Pair(_b(false))(_n(1))))).toBe(false); }); it('(False, 1) ge (False, 0) is True', () => { expect($b(ge(bcmp)(ncmp)(Pair(_b(false))(_n(1)))(Pair(_b(false))(_n(0))))).toBe(true); }); it('(False, 0) ge (True, 0) is False', () => { expect($b(ge(bcmp)(ncmp)(Pair(_b(false))(_n(0)))(Pair(_b(true))(_n(0))))).toBe(false); }); it('(True, 0) ge (False, 0) is True', () => { expect($b(ge(bcmp)(ncmp)(Pair(_b(true))(_n(0)))(Pair(_b(false))(_n(0))))).toBe(true); }); it('ignores second if first not equal', () => { expect($b(ge(bcmp)(undef)(Pair(_b(false))(undef))(Pair(_b(true))(undef)))).toBe(false); }); }); describe('gt', () => { it('(False, 0) gt (False, 0) is False', () => { expect($b(gt(bcmp)(ncmp)(Pair(_b(false))(_n(0)))(Pair(_b(false))(_n(0))))).toBe(false); }); it('(False, 0) gt (False, 1) is False', () => { expect($b(gt(bcmp)(ncmp)(Pair(_b(false))(_n(0)))(Pair(_b(false))(_n(1))))).toBe(false); }); it('(False, 1) gt (False, 0) is True', () => { expect($b(gt(bcmp)(ncmp)(Pair(_b(false))(_n(1)))(Pair(_b(false))(_n(0))))).toBe(true); }); it('(False, 0) gt (True, 0) is False', () => { expect($b(gt(bcmp)(ncmp)(Pair(_b(false))(_n(0)))(Pair(_b(true))(_n(0))))).toBe(false); }); it('(True, 0) gt (False, 0) is True', () => { expect($b(gt(bcmp)(ncmp)(Pair(_b(true))(_n(0)))(Pair(_b(false))(_n(0))))).toBe(true); }); it('ignores second if first not equal', () => { expect($b(gt(bcmp)(undef)(Pair(_b(false))(undef))(Pair(_b(true))(undef)))).toBe(false); }); }); describe('show', () => { it('show (False, 0) is "(False, 0)"', () => { expect($s(show(bshow)(nshow)(Pair(_b(false))(_n(0))))).toBe('(False, 0)'); }); it('show (False, 1) is "(False, 1)"', () => { expect($s(show(bshow)(nshow)(Pair(_b(false))(_n(1))))).toBe('(False, 1)'); }); it('show (True, 0) is "(True, 0)"', () => { expect($s(show(bshow)(nshow)(Pair(_b(true))(_n(0))))).toBe('(True, 0)'); }); it('show (True, 1) is "(True, 1)"', () => { expect($s(show(bshow)(nshow)(Pair(_b(true))(_n(1))))).toBe('(True, 1)'); }); }); });