calm-evt: event wrapper that calms an event’s delivery.

 (require (planet "" ("dyoo" "calm-evt.plt" 1 0)))

calm-evt wraps around events and calms them down.  It’s meant
to be similar to the behavior of
calm-e in the
Flapjax language.

1. Example

  > (module exercise-calm-evt mzscheme
      (require (lib "" "mred")
               (lib "")
               (lib "")
               (planet "" ("dyoo" "calm-evt.plt" 1)))
      (provide test)
      (define text%/changed-notification
        (class text%
          (inherit get-text)
          (define notify-channel (make-async-channel))
          (define/public (get-notify-channel)
          (define/augment (after-insert pos len)
            (inner (void) after-insert pos len)
            (async-channel-put notify-channel (get-text)))
          (define/augment (after-delete pos len)
            (inner (void) after-delete pos len)
            (async-channel-put notify-channel (get-text)))
      (define (test)
        (parameterize ([current-eventspace (make-eventspace)])
          (define f (new frame% [label ""]))
          (define t (new text%/changed-notification))
          (define c (new editor-canvas%
                         [parent f]
                         [editor t]))
          (send f show #t)
           (lambda ()
             (define delayed-change-evt
               (make-calm-evt (send t get-notify-channel)))
             (let loop ()
               (sync (handle-evt delayed-change-evt
                                 (lambda (val)
                                   (printf "~s~n" val))))

Run the test function, and then start typing in the new
frame.  Changes in the text will be printed out, but only after a
period of inactivity.

2. API

A calm-evt can be used as an argument to sync.  Its
result is the result of the event that it wraps.

(make-calm-evt wrapped-evt    
  [delay-in-milliseconds]) -> calm-evt?
  wrapped-evt : evt?
  delay-in-milliseconds : natural-number/c = 1000

Creates a new calm-evt that wraps around the wrapped-evt.

(calm-evt? datum) -> boolean?
  datum : any/c

Returns true if the datum is a calm-evt.