Nanoseconds Produce Minutes

    babel-plugin-trace-execution

    0.2.0 • Public • Published

    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;

    Keywords

    none

    Install

    npm i babel-plugin-trace-execution

    DownloadsWeekly Downloads

    2

    Version

    0.2.0

    License

    MIT

    Last publish

    Collaborators

    • skidding