let indent: string = ''; const logs: string[] = []; let logging: boolean = false; export function log(): void { logging = true; } export function withLog(before: string, f: () => T, after: (v: T) => string): T { if (!logging) { return f(); } logs.push(`${indent}${before}`); const l = logs.length; indent += ' '; const result = f(); indent = indent.slice(2); if (logs.length === l) { logs[logs.length - 1] += ` ${after(result)}`; } else { logs.push(`${indent}${after(result)}`); } return result; } export function dump() { console.log('\n\nExecution log:'); console.log(logs.join('\n')); }