#lang whalesong
(require whalesong/js/world
         whalesong/js
         whalesong/web-world)

;; Test of getting world events from arbitrary JavaScript function application.

;; We first define a new event handler type, by using make-js-world-event:
(define-values (on-message send)
  (make-js-world-event))

;; It gives us two values back:
;; 1.  An event handler that can be passed to big-bang
;; 2.  A raw JavaScript function that can fire events


;; Let's attach the send-event function to a toplevel function on the window.
(void ((js-function->procedure "function(send) { $(window).bind('message', function(e) { send(e.originalEvent.data); })}")
       send))
;; js-function lifts JavaScript functions to regular function we can call.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; With this infrastructure, we can make a world program that responds to window postMessage.  For example,
;; we can present a log of all the messages we receive.

(define-struct world (time messages))

(define (read-message w v msg)
  (make-world (world-time w)
              (cons (format "at time ~a: ~s"
                            (world-time w)
                            msg)
                    (world-messages w))))

(define (tick w v)
  (make-world (add1 (world-time w))
              (world-messages w)))


;; Finally, let's use our big bang:
(big-bang (make-world 0 '())
          (on-tick tick 1)
          (on-message read-message))

