command.ss
(module command mzscheme
  
  (require (lib "contract.ss")
           (lib "cut.ss" "srfi" "26"))
  
  (require (file "base.ss")
           (file "core.ss"))
  
  ; Commands -------------------------------------
  
  ;; open/wait : (U (request -> response) string) -> void
  (define (open/wait url+generate)
    (respond/stmt
     (lambda (embed-url)
       (js:stmt (ignore ((dot Delirium api openAndWait)
                         ,(embed-url (lambda (request) request))
                         ,(if (string? url+generate)
                              url+generate
                              (embed-url url+generate))))))))

  
  ;; click/wait : selector -> request
  (define (click/wait selector)
    (respond/stmt
     (lambda (embed-url)
       (js:stmt (ignore ((dot Delirium api clickAndWait)
                         ,(embed-url (lambda (request) request))
                         #,selector))))))

  ;; click*/wait : selector -> request
  (define (click*/wait selector)
    (respond/stmt
     (lambda (embed-url)
       (js:stmt (ignore ((dot Delirium api clickAllAndWait)
                         ,(embed-url (lambda (request) request))
                         #,selector))))))

  
  ;; click : selector -> void
  (define (click selector)
    (respond/expr
     (lambda (embed-url)
       (js:expr ((dot Delirium api click) #,selector)))))

  ;; click* : selector -> void
  (define (click* selector)
    (respond/expr
     (lambda (embed-url)
       (js:expr ((dot Delirium api clickAll) #,selector)))))

  
  ;; select : selector (U symbol string) -> void
  (define (select selector value)
    (respond/expr
     (lambda (embed-url)
       (js:expr ((dot Delirium api select) #,selector ,value)))))

  ;; select* : selector (U symbol string) -> void
  (define (select* selector value)
    (respond/expr
     (lambda (embed-url)
       (js:expr ((dot Delirium api selectAll) #,selector ,value)))))

  
  ;; type : selector string -> void
  (define (type selector value)
    (respond/expr
     (lambda (embed-url)
       (js:expr ((dot Delirium api type) #,selector ,value)))))

  ;; type* : selector string -> void
  (define (type* selector value)
    (respond/expr
     (lambda (embed-url)
       (js:expr ((dot Delirium api typeAll) #,selector ,value)))))

  
  ; Provide statements ---------------------------
  
  (provide/contract
   [open/wait  (-> (or/c (-> request? response?) string?) void?)]
   [click/wait (-> javascript-expression? void?)]
   [click*/wait (-> javascript-expression? void?)]
   [click      (-> javascript-expression? void?)]
   [click*     (-> javascript-expression? void?)]
   [select     (-> javascript-expression? (or/c string? symbol?) any)]
   [select*    (-> javascript-expression? (or/c string? symbol?) any)]
   [type       (-> javascript-expression? string? any)]
   [type*      (-> javascript-expression? string? any)])
  
  )