function repeat(count, thunk) { let result = ""; for (let i = 0; i < count; i++) result += thunk(i); return result; } function createSimple(outerDepth, innerDepth, returnDepth) { return Function( ` return (function(arg) { ${repeat(outerDepth, (i) => `for (let a${i} in arg) ` + "{\n" )} try { ${repeat(innerDepth, (i) => `for (let b${i} in arg) ` + "{\n" )} return {}; ${repeat(innerDepth, () => "}")} } finally { return a${returnDepth}} ${repeat(outerDepth, () => "}")} }) ` )(); } function test(result, argument, ...args) { let f = createSimple(...args); let r = f(argument); if (r !== result) { throw new Error(r); } } test("0", [1,2], 1, 1, 0); test("0", [1,2], 2, 1, 0); test("0", [1,2], 2, 4, 1); test("0", [1,2], 1, 0, 0);