5var staticDebugger = null;
7Elm.debuggerInit = function(module) {
9 staticDebugger = debuggerInit(module, elm);
10 return staticDebugger.moduleRetValue;
14Elm.debuggerReset = function() {
15 staticDebugger.reset();
18Elm.debuggerRecord = function() {
19 staticDebugger.startRecording();
22Elm.debuggerPlayback = function() {
23 staticDebugger.stopRecording();
27function debuggerInit(module, elm) {
28 var State = { OFF: 0, RECORDING: 1, PLAYBACK: 2 };
29 var debuggerState = State.RUNNING;
32 var initialProgramState = null;
33 var recordedEvents = [];
36 function wrapNotify(id, v) {
37 var timestep = Date.now();
38 if (debuggerState != State.PLAYBACK) {
39 elm.notify(id, v, timestep);
41 if (debuggerState == State.RECORDING) {
42 recordEvent(id, v, timestep);
46 function wrapRunDelayed(func, delayMs) {
47 return safeSetTimeout(func, delayMs);
50 function safeSetTimeout(func, delayMs) {
51 var timerId = setTimeout(func, delayMs);
52 asyncTimers.push(timerId);
56 function recordEvent(id, v, timestep) {
57 recordedEvents.push([id, v, timestep]);
60 function resetProgram() {
62 restoreProgramState(allNodes, initialProgramState);
66 function startRecording() {
68 restoreProgramState(allNodes, initialProgramState);
69 debuggerState = State.RECORDING;
73 function stopRecording() {
75 restoreProgramState(allNodes, initialProgramState);
76 debuggerState = State.PLAYBACK;
77 doPlayback(recordedEvents);
80 function clearAsyncEvents() {
81 asyncTimers.forEach(function(id) {
86 function doPlayback(eventList) {
87 var x = eventList.shift();
89 elm.notify(x[0], x[1], x[2]);
91 if (eventList.length > 0) {
92 var delta = eventList[0][2] - time;
93 setTimeout(function() { doPlayback(eventList); }, delta);
97 function redrawGraphics() {
98 var graphicsFoldp = moduleRetValue.main.kids[0];
99 graphicsFoldp.recv(Date.now(), true, moduleRetValue.main.id);
104 runDelayed: wrapRunDelayed,
106 display: elm.display,
108 addListener: elm.addListener,
112 var moduleRetValue = module(wrappedElm);
115 moduleRetValue: moduleRetValue,
117 // debugger functions
118 startRecording: startRecording,
119 stopRecording: stopRecording,
123 allNodes = flattenNodes(wrappedElm.inputs);
124 initialProgramState = saveProgramState(allNodes);
131function assert(bool, msg) {
133 throw "Assertion error: " + msg;
137function saveProgramState(allNodes) {
140 allNodes.forEach(function(node) {
141 nodeValues.push({ value: node.value, id: node.id });
148function restoreProgramState(allNodes, nodeStates) {
149 assert(allNodes.length == nodeStates.length, "saved program state has wrong length");
150 for (var i=0; i < allNodes.length; i++) {
151 var node = allNodes[i];
152 var state = nodeStates[i];
153 assert(node.id == state.id, "the nodes moved position");
155 node.value = state.value;
159function flattenNodes(nodes) {
160 var treeReduce = function(prev, cur, i, arr) {
161 var flatKids = cur.kids.reduce(treeReduce, []);
163 return prev.concat(flatKids);
166 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