babel-plugin-trace-execution
v0.2.0
Published
Trace execution context of JS functions
Downloads
12
Readme
babel-plugin-trace-execution
Trace execution context of JS functions
Turns
export default function binarySearch(list, item) {
let low = 0;
let high = list.length - 1;
while (low <= high) {
const mid = Math.round((low + high) / 2);
const guess = list[mid];
if (guess === item) {
return mid;
}
if (guess > item) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return null;
}
into
const cloneDeep = require('lodash.clonedeep');
let __steps;
let __parentStepId;
let __lastStepId;
function __enterCall() {
__parentStepId = __lastStepId;
}
function __leaveCall() {
if (__parentStepId) {
__lastStepId = __parentStepId;
__parentStepId = __steps[__parentStepId].parentStepId;
}
}
function __trace({
step,
enterCall,
leaveCall
}) {
if (enterCall) {
__enterCall();
}
__steps.push({
parentStepId: __parentStepId,
...step
});
__lastStepId = __steps.length - 1;
if (leaveCall) {
__leaveCall();
}
}
function binarySearch(list, item) {
__trace({
step: {
highlight: {
start: 9,
end: 33
},
bindings: {
list: cloneDeep(list),
item: cloneDeep(item)
}
},
enterCall: true
});
let low = 0;
__trace({
step: {
highlight: {
start: 38,
end: 50
},
bindings: {
list: cloneDeep(list),
item: cloneDeep(item),
low: cloneDeep(low)
}
}
});
let high = list.length - 1;
__trace({
step: {
highlight: {
start: 53,
end: 80
},
bindings: {
list: cloneDeep(list),
item: cloneDeep(item),
low: cloneDeep(low),
high: cloneDeep(high)
}
}
});
while ((() => {
__trace({
step: {
highlight: {
start: 91,
end: 102
},
bindings: {
list: cloneDeep(list),
item: cloneDeep(item),
low: cloneDeep(low),
high: cloneDeep(high)
},
compared: ["low", "high"]
}
});
return low <= high;
})()) {
const mid = Math.round((low + high) / 2);
__trace({
step: {
highlight: {
start: 110,
end: 151
},
bindings: {
list: cloneDeep(list),
item: cloneDeep(item),
low: cloneDeep(low),
high: cloneDeep(high),
mid: cloneDeep(mid)
}
}
});
const guess = list[mid];
__trace({
step: {
highlight: {
start: 156,
end: 180
},
bindings: {
list: cloneDeep(list),
item: cloneDeep(item),
low: cloneDeep(low),
high: cloneDeep(high),
mid: cloneDeep(mid),
guess: cloneDeep(guess)
}
}
});
if ((() => {
__trace({
step: {
highlight: {
start: 190,
end: 204
},
bindings: {
list: cloneDeep(list),
item: cloneDeep(item),
low: cloneDeep(low),
high: cloneDeep(high),
mid: cloneDeep(mid),
guess: cloneDeep(guess)
},
compared: ["guess", "item"]
}
});
return guess === item;
})()) {
return (() => {
const _uid = mid;
__trace({
step: {
highlight: {
start: 214,
end: 225
},
bindings: {
list: cloneDeep(list),
item: cloneDeep(item),
low: cloneDeep(low),
high: cloneDeep(high),
mid: cloneDeep(mid),
guess: cloneDeep(guess)
},
returnValue: _uid
},
leaveCall: true
});
return _uid;
})();
}
if ((() => {
__trace({
step: {
highlight: {
start: 240,
end: 252
},
bindings: {
list: cloneDeep(list),
item: cloneDeep(item),
low: cloneDeep(low),
high: cloneDeep(high),
mid: cloneDeep(mid),
guess: cloneDeep(guess)
},
compared: ["guess", "item"]
}
});
return guess > item;
})()) {
high = mid - 1;
__trace({
step: {
highlight: {
start: 262,
end: 276
},
bindings: {
list: cloneDeep(list),
item: cloneDeep(item),
low: cloneDeep(low),
high: cloneDeep(high),
mid: cloneDeep(mid),
guess: cloneDeep(guess)
}
}
});
} else {
low = mid + 1;
__trace({
step: {
highlight: {
start: 297,
end: 310
},
bindings: {
list: cloneDeep(list),
item: cloneDeep(item),
low: cloneDeep(low),
high: cloneDeep(high),
mid: cloneDeep(mid),
guess: cloneDeep(guess)
}
}
});
}
}
return (() => {
const _uid2 = null;
__trace({
step: {
highlight: {
start: 325,
end: 337
},
bindings: {
list: cloneDeep(list),
item: cloneDeep(item),
low: cloneDeep(low),
high: cloneDeep(high)
},
returnValue: _uid2
},
leaveCall: true
});
return _uid2;
})();
}
function __traceWrapper(...args) {
__steps = [];
__parentStepId = undefined;
__lastStepId = undefined;
const returnValue = binarySearch(...args);
return {
steps: __steps,
returnValue: returnValue
};
}
;
__traceWrapper.code = "function binarySearch(list, item) {\n let low = 0;\n let high = list.length - 1;\n\n while (low <= high) {\n const mid = Math.round((low + high) / 2);\n const guess = list[mid];\n\n if (guess === item) {\n return mid;\n }\n if (guess > item) {\n high = mid - 1;\n } else {\n low = mid + 1;\n }\n }\n\n return null;\n}";
module.exports = __traceWrapper;