ontick looks like it's doing something reasonable
This commit is contained in:
parent
f1920ae7c4
commit
0469cfe4cd
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
;; tick: world view -> world
|
;; tick: world view -> world
|
||||||
(define (tick w v)
|
(define (tick w v)
|
||||||
|
(printf "Tick\n")
|
||||||
(add1 w))
|
(add1 w))
|
||||||
|
|
||||||
(big-bang 0
|
(big-bang 0
|
||||||
|
|
|
@ -275,34 +275,54 @@
|
||||||
return success(view);
|
return success(view);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
var defaultStopWhen = function(world, success, fail) {
|
var defaultStopWhen = function(world, success, fail) {
|
||||||
return success(false);
|
return success(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
var EventQueue = function() {
|
||||||
|
this.elts = [];
|
||||||
|
};
|
||||||
|
EventQueue.prototype.queue = function(elt) {
|
||||||
|
this.elts.push(elt);
|
||||||
|
};
|
||||||
|
|
||||||
|
EventQueue.prototype.dequeue = function() {
|
||||||
|
return this.elts.shift();
|
||||||
|
};
|
||||||
|
|
||||||
|
EventQueue.prototype.isEmpty = function() {
|
||||||
|
return this.elts.length === 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
var EventQueueElement = function(handler, data) {
|
||||||
|
this.handler = handler;
|
||||||
|
this.data = data;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// bigBang.
|
// bigBang.
|
||||||
var bigBang = function(MACHINE, world, handlers) {
|
var bigBang = function(MACHINE, world, handlers) {
|
||||||
var oldArgcount = MACHINE.argcount;
|
var oldArgcount = MACHINE.argcount;
|
||||||
var worldSetter = function(v) { world = v; };
|
|
||||||
var worldGetter = function(v) { return world; };
|
|
||||||
|
|
||||||
|
var view = (find(handlers, isInitialViewHandler) || { view : new View(plt.baselib.format.toDomNode(world),
|
||||||
var defaultView = new View(plt.baselib.format.toDomNode(world),
|
[],
|
||||||
[],
|
[],
|
||||||
[],
|
[])}).view;
|
||||||
[]);
|
|
||||||
|
|
||||||
var view = (find(handlers, isInitialViewHandler) || { view : defaultView}).view;
|
|
||||||
var stopWhen = (find(handlers, isStopWhenHandler) || { stopWhen: defaultStopWhen }).stopWhen;
|
var stopWhen = (find(handlers, isStopWhenHandler) || { stopWhen: defaultStopWhen }).stopWhen;
|
||||||
var toDraw = (find(handlers, isToDrawHandler) || {toDraw : defaultToDraw} ).toDraw;
|
var toDraw = (find(handlers, isToDrawHandler) || {toDraw : defaultToDraw} ).toDraw;
|
||||||
|
|
||||||
var eventQueue = [];
|
var eventQueue = new EventQueue();
|
||||||
|
|
||||||
var top = $("<div/>");
|
var top = $("<div/>");
|
||||||
MACHINE.params.currentDisplayer(MACHINE, top);
|
MACHINE.params.currentDisplayer(MACHINE, top);
|
||||||
|
|
||||||
PAUSE(function(restart) {
|
PAUSE(function(restart) {
|
||||||
|
|
||||||
var onRestart = function() {
|
var onCleanRestart = function() {
|
||||||
var i;
|
var i;
|
||||||
for (i = 0; i < eventHandlers.length; i++) {
|
for (i = 0; i < eventHandlers.length; i++) {
|
||||||
stopEventHandler(eventHandlers[i]);
|
stopEventHandler(eventHandlers[i]);
|
||||||
|
@ -312,11 +332,54 @@
|
||||||
finalizeClosureCall(MACHINE, world);
|
finalizeClosureCall(MACHINE, world);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var onMessyRestart = function(exn) {
|
||||||
|
var i;
|
||||||
|
for (i = 0; i < eventHandlers.length; i++) {
|
||||||
|
stopEventHandler(eventHandlers[i]);
|
||||||
|
}
|
||||||
|
restart(function(MACHINE) {
|
||||||
|
plt.baselib.exceptions.raise(MACHINE, exn);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var dispatchEventsInQueue = function() {
|
||||||
|
// Apply all the events on the queue, call toDraw, and then stop.
|
||||||
|
// If the world ever satisfies stopWhen, stop immediately and quit.
|
||||||
|
var nextEvent;
|
||||||
|
var data;
|
||||||
|
var racketWorldCallback;
|
||||||
|
|
||||||
|
if(! eventQueue.isEmpty() ) {
|
||||||
|
nextEvent = eventQueue.dequeue();
|
||||||
|
// FIXME: deal with event data here
|
||||||
|
racketWorldCallback = nextEvent.handler.racketWorldCallback;
|
||||||
|
|
||||||
|
racketWorldCallback(MACHINE,
|
||||||
|
world,
|
||||||
|
view,
|
||||||
|
// data,
|
||||||
|
function(newWorld) {
|
||||||
|
world = newWorld;
|
||||||
|
dispatchEventsInQueue();
|
||||||
|
},
|
||||||
|
function(err) {
|
||||||
|
onMessyRestart(err);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// call redraw
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
var startEventHandler = function(handler) {
|
var startEventHandler = function(handler) {
|
||||||
var fireEvent = function() {
|
var fireEvent = function() {
|
||||||
var args = [].slice.call(arguments, 0);
|
var args = [].slice.call(arguments, 0);
|
||||||
eventQueue.push({ handler : handler, data : args });
|
eventQueue.queue(new EventQueueElement(handler, args));
|
||||||
|
setTimeout(dispatchEventsInQueue, 0);
|
||||||
//
|
//
|
||||||
// fixme: if we see too many events accumulating, throttle
|
// fixme: if we see too many events accumulating, throttle
|
||||||
// the ones that are marked as throttleable.
|
// the ones that are marked as throttleable.
|
||||||
|
@ -355,7 +418,7 @@
|
||||||
return function(MACHINE) {
|
return function(MACHINE) {
|
||||||
var success = arguments[arguments.length - 2];
|
var success = arguments[arguments.length - 2];
|
||||||
var fail = arguments[arguments.length - 1];
|
var fail = arguments[arguments.length - 1];
|
||||||
var args = [].slice.call(arguments, 0, arguments.length - 2);
|
var args = [].slice.call(arguments, 1, arguments.length - 2);
|
||||||
return plt.baselib.functions.internalCallDuringPause.apply(null,
|
return plt.baselib.functions.internalCallDuringPause.apply(null,
|
||||||
[MACHINE,
|
[MACHINE,
|
||||||
proc,
|
proc,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user