import 'dotenv/config'; import Prando from 'prando'; import {Gen, listOf, property, shrinklist, someInt} from './property.js'; function arrayEquals(a: A[], b: A[]): boolean { return ( Array.isArray(a) && Array.isArray(b) && a.length === b.length && a.every((val, index) => val === b[index]) ); } function reverse(arr: A[]): A[] { const result = []; for (let i = arr.length - 1; i >= 0; i--) { result.push(arr[i]); } return result; } function reverse_is_self_inverse(arr: number[]): Promise { return Promise.resolve(arrayEquals(reverse(reverse(arr)), arr)); } function gen2lists(gen: Gen): Gen<[A[], A[]]> { return (rng: Prando) => { const gl = listOf(gen)(rng); return (size: number) => { return [gl(size), gl(size)]; }; }; } function reverse_with_two_lists(arrs: [A[], A[]]): Promise { return Promise.resolve( arrayEquals( reverse(arrs[0].concat(arrs[1])), reverse(arrs[1]).concat(reverse(arrs[0])), ), ); } function shrink2lists([l1, l2]: [A[], A[]]): [A[], A[]][] { const result: [A[], A[]][] = []; const s1 = shrinklist(l1); const s2 = shrinklist(l2); for (let i = 0; i < s1.length; i++) { const j = s2.length - i - 1; const news2 = j >= 0 ? s2[j] : []; result.push([s1[i], news2]); } return result; } export const prop_reverse_with_two_lists = property<[number[], number[]]>( gen2lists(someInt), reverse_with_two_lists, shrink2lists, ); export const prop_reverse_is_self_inverse = property( listOf(someInt), reverse_is_self_inverse, shrinklist, l => { const tens = Math.floor(l.length / 10); return '< ' + 10 * (tens + 1); }, );