From 693bec328d60101a66ce19ff3c91dc6fb82c3336 Mon Sep 17 00:00:00 2001 From: Danny Yoo Date: Mon, 22 Aug 2011 18:03:29 -0400 Subject: [PATCH] need to write the code to handler initialization --- web-world/impl.rkt | 3 +- web-world/js-impl.js | 104 ++++++++++++++++++++++++++++++++++---- web-world/racket-impl.rkt | 10 +++- 3 files changed, 104 insertions(+), 13 deletions(-) diff --git a/web-world/impl.rkt b/web-world/impl.rkt index ca85f20..942aa1d 100644 --- a/web-world/impl.rkt +++ b/web-world/impl.rkt @@ -10,4 +10,5 @@ #:javascript ("js-impl.js") #:provided-values (big-bang initial-view - stop-when)) + stop-when + on-tick)) diff --git a/web-world/js-impl.js b/web-world/js-impl.js index b52e9a4..a701b6b 100644 --- a/web-world/js-impl.js +++ b/web-world/js-impl.js @@ -104,6 +104,22 @@ var isStopWhenHandler = plt.baselib.makeClassPredicate(StopWhenHandler); +var OnTickHandler = function(args, onTick, delay) { + WorldHandler.call(this, args); + // stopWhen: Racket procedure (World -> boolean) + this.onTick = onTick; + this.delay = delay; +}; + +OnTickHandler.prototype = plt.baselib.heir(WorldHandler.prototype); +OnTickHandler.prototype.toString = function() { return "#"; }; + +var isOnTickHandler = plt.baselib.makeClassPredicate(OnTickHandler); + + + + + var findHandler = function(MACHINE, pred) { var i; @@ -116,6 +132,19 @@ var findHandler = function(MACHINE, pred) { }; +// var startHandlers = function(MACHINE, handlers, onEvent, success, fail) { +// if (handlers.length === 0) { +// success(); +// } +// handlers[0].onStart(MACHINE, onEvent, +// function(data) { +// startHandlers(MACHINE, handlers.slice(1), onEvent, success, fail); +// }); +// } + + + + ////////////////////////////////////////////////////////////////////// @@ -123,16 +152,19 @@ EXPORTS['big-bang'] = makeClosure( 'big-bang', plt.baselib.arity.makeArityAtLeast(1), function(MACHINE) { + var oldArgcount = MACHINE.argcount; var world = MACHINE.env[MACHINE.env.length - 1]; var initialViewHandler = findHandler(MACHINE, isInitialViewHandler); - - var oldArgcount = MACHINE.argcount; var top = $("
"); MACHINE.params.currentDisplayer(MACHINE, top); PAUSE(function(restart) { initialViewHandler.view.initialRender(top); + + // Initialize event handlers to send to that channel. + + var onRestart = function() { restart(function(MACHINE) { MACHINE.argcount = oldArgcount; @@ -155,10 +187,19 @@ EXPORTS['initial-view'] = makeClosure( restart(function(MACHINE) { finalizeClosureCall(MACHINE, new InitialViewHandler( - { onStart : function(MACHINE, k) {k()}, - onPause : function(MACHINE, k) {k()}, - onResume : function(MACHINE, k) {k()}, - onStop : function(MACHINE, k) {k()} + { + onStart : function(MACHINE, onEvent, k) { + k(); + }, + onPause : function(MACHINE, data, k) { + k(data); + }, + onResume : function(MACHINE, data, k) { + k(data); + }, + onStop : function(MACHINE, data, k) { + k(); + } }, v)); }); @@ -181,10 +222,19 @@ EXPORTS['stop-when'] = makePrimitiveProcedure( function(MACHINE) { var stopWhen = checkProcedure(MACHINE, 'stop-when', 0); return new StopWhenHandler( - { onStart : function(MACHINE, k) {k()}, - onPause : function(MACHINE, k) {k()}, - onResume : function(MACHINE, k) {k()}, - onStop : function(MACHINE, k) {k()} + { + onStart : function(MACHINE, onEvent, k) { + k() + }, + onPause : function(MACHINE, data, k) { + k(data) + }, + onResume : function(MACHINE, data, k) { + k(data) + }, + onStop : function(MACHINE, data, k) { + k() + } }, stopWhen ); @@ -192,6 +242,40 @@ EXPORTS['stop-when'] = makePrimitiveProcedure( }); +EXPORTS['on-tick'] = makePrimitiveProcedure( + 'on-tick', + 1, + function(MACHINE) { + var onTick = checkProcedure(MACHINE, 'on-tick', 0); + return new OnTickHandler( + { + onStart : function(MACHINE, onEvent, k) { + var id = setInterval(function () { onEvent(); }, + this.delay); + k( { id : id, + onEvent : onEvent }) ; + }, + onPause : function(MACHINE, data, k) { + clearInterval(data.id); + k(data) + }, + onResume : function(MACHINE, data, k) { + data.id = setInterval(function () { data.onEvent() }, + this.delay); + k(data) + }, + onStop : function(MACHINE, data, k) { + clearInterval(data.id); + k() + } + }, + onTick + ); + return undefined; + }); + + + diff --git a/web-world/racket-impl.rkt b/web-world/racket-impl.rkt index 6d25755..7c9fca5 100644 --- a/web-world/racket-impl.rkt +++ b/web-world/racket-impl.rkt @@ -8,5 +8,11 @@ (define (initial-view a-view-or-resource) (error 'initial-view "Please run in JavaScript context.")) -(define (stop-when a-view-or-resource) - (error 'stop-when "Please run in JavaScript context.")) \ No newline at end of file +(define (stop-when f) + (error 'stop-when "Please run in JavaScript context.")) + +(define on-tick + (case-lambda [(f) + (error 'on-tick "Please run in JavaScript context.")] + [(f delay) + (error 'on-tick "Please run in JavaScript context.")]))