Memory leakage added by Kooda on Fri Feb 20 13:35:49 2015

(use doodle sdl-base lazy-seq fps fps-cairo matchable clojurian-syntax)

(include "doodle-utils")

(define next-event
  (let ((ev (make-sdl-event)))
    (lambda ()
      (if (sdl-poll-event! ev)
        (translate-events ev)
        '(none)))))

(define (time-stream)
  (define last (sdl-get-ticks))
  (lazy-seq (cons 0
                  (lazy-repeatedly
                    (lambda ()
                      (let* ((now (sdl-get-ticks))
                             (dt (/ (- now last) 1000)))
                        (set! last now)
                        dt))))))

(define (make-clock time)
  (lazy-reductions + 0 time))

(define (event-stream)
  (lazy-repeatedly next-event))

(define (timing-event? e)
  (eq? (car e) 'timing))


(define (lazy-reductions kons knil . streams)
  (letrec ((s (lazy-seq
                (cons knil
                      (apply lazy-map kons s streams)))))
    s))

(define (scale-stream factor stream)
  (lazy-map
    (cut * factor <>)
    stream))

(define (scale-pt-stream factors points)
  (lazy-map
    (lambda (f p)
      (scale-pt f f p))
    factors points))

; Logic

(define (movement-keys events)
  (lazy-reductions
    (lambda (previous event)
      (add-pts
        previous
        (match event
          ((or ('key 'pressed 'up)
               ('key 'released 'down))  (pt 0 -1))
          ((or ('key 'pressed 'down)
               ('key 'released 'up))  (pt 0 1))
          ((or ('key 'pressed 'left)
               ('key 'released 'right))  (pt -1 0))
          ((or ('key 'pressed 'right)
               ('key 'released 'left))  (pt 1 0))
          (else  origin))))
    origin events))

(define (square-position dts keys-status)
  (lazy-reductions
    add-pts
    origin
    (scale-pt-stream (scale-stream 10 dts) keys-status)))

(define (sin-oscilator amplitude freq time)
  (lazy-map
    (lambda (t) (* amplitude (sin (* freq t 2pi))))
    (make-clock time)))

(define (cos-oscilator amplitude freq time)
  (lazy-map
    (lambda (t) (* amplitude (cos (* freq t 2pi))))
    (make-clock time)))

(define (wiggle picture time)
  (lazy-map
    (lambda (x y)
      (translate (+ x (/ doodle-width 2)) (+ y (/ doodle-height 2))
        picture))
    (sin-oscilator 100 0.5 time)
    (cos-oscilator 100 0.5 time)))


; Rendering

(new-doodle width: 320 height: 240)

(define chan (cairo-channel (doodle-context)))

(define (square position-stream)
  (lazy-map
    (lambda (pos)
      (begin
        (print pos)
        (fill (rect pos 10 10) (:color (rgb 1 0 0)))))
    position-stream))

(define clear
  (fill (rect origin doodle-width doodle-height) (:color (rgb 0 0 0))))

(define (render pict)
  (show chan (compose clear pict))
  (show!)
  (gc))


(->>
  (time-stream)
  (wiggle (fill (arc origin 10 0 2pi) (:color (rgb 0 1 0))))
  (lazy-each render)
  )