5var staticDebugger = null;
7Elm.debuggerInit = function(module) {
9 staticDebugger = debuggerInit(module, elm);
10 return staticDebugger.moduleRetValue;
14Elm.debuggerReset = function() {
15 staticDebugger.reset();
18Elm.debuggerRestart = function() {
19 staticDebugger.restart();
22Elm.debuggerGetMaxSteps = function() {
23 return staticDebugger.getMaxSteps();
26Elm.debuggerStepTo = function(index) {
27 staticDebugger.stepTo(index);
30function debuggerInit(module, elm) {
32 var programPaused = false;
35 var recordedEvents = [];
38 var initialProgramState = {
43 function wrapNotify(id, v) {
44 var timestep = Date.now();
47 // ignore notify because we are stepping
50 elm.notify(id, v, timestep);
51 recordEvent(id, v, timestep);
55 function wrapRunDelayed(func, delayMs) {
56 return safeSetTimeout(func, delayMs);
59 function safeSetTimeout(func, delayMs) {
60 var timerId = setTimeout(func, delayMs);
61 asyncTimers.push({ func:func, delayMs:delayMs, timerId:timerId });
65 function recordEvent(id, v, timestep) {
66 recordedEvents.push({ id:id, value:v, timestep:timestep });
69 function resetProgram() {
71 restoreNodeValues(allNodes, initialProgramState.nodeValues);
75 function restartProgram() {
78 initialProgramState.asyncTimers.forEach(function(timer) {
79 var func = timer.func;
84 function gotoStep(index) {
90 if (index < 0 || index >= recordedEvents.length) {
91 throw "Index out of bounds: " + index;
94 if (index < eventCounter) {
99 assert(index >= eventCounter, "index must be bad");
100 while (eventCounter < index) {
101 var nextEvent = recordedEvents[eventCounter];
102 elm.notify(nextEvent.id, nextEvent.value, nextEvent.timestep);
106 assert(eventCounter == index, "while loop didnt' work");
109 function getMaxSteps() {
110 return recordedEvents.length - 1;
113 function clearAsyncEvents() {
114 asyncTimers.forEach(function(timer) {
115 clearTimeout(timer.timerId);
119 function doPlayback(eventList) {
120 var x = eventList.shift();
122 elm.notify(x[0], x[1], x[2]);
124 if (eventList.length > 0) {
125 var delta = eventList[0][2] - time;
126 setTimeout(function() { doPlayback(eventList); }, delta);
130 function redrawGraphics() {
131 var graphicsFoldp = moduleRetValue.main.kids[0];
132 graphicsFoldp.recv(Date.now(), true, moduleRetValue.main.id);
137 runDelayed: wrapRunDelayed,
139 display: elm.display,
141 addListener: elm.addListener,
145 var moduleRetValue = module(wrappedElm);
148 moduleRetValue: moduleRetValue,
150 // debugger functions
152 restart: restartProgram,
153 getMaxSteps: getMaxSteps,
157 allNodes = flattenNodes(wrappedElm.inputs);
158 initialProgramState.nodeValues = saveNodeValues(allNodes);
159 initialProgramState.asyncTimers = asyncTimers.slice();
166function assert(bool, msg) {
168 throw "Assertion error: " + msg;
172function saveNodeValues(allNodes) {
175 allNodes.forEach(function(node) {
176 nodeValues.push({ value: node.value, id: node.id });
183function restoreNodeValues(allNodes, nodeStates) {
184 assert(allNodes.length == nodeStates.length, "saved program state has wrong length");
185 for (var i=0; i < allNodes.length; i++) {
186 var node = allNodes[i];
187 var state = nodeStates[i];
188 assert(node.id == state.id, "the nodes moved position");
190 node.value = state.value;
194function flattenNodes(nodes) {
195 var treeReduce = function(prev, cur, i, arr) {
196 var flatKids = cur.kids.reduce(treeReduce, []);
198 return prev.concat(flatKids);
201 return nodes.reduce(treeReduce, []);
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list