anchor.diff:    "Block and return next PROMPTER ready source.
   It's the next source that's done updating.
   If all sources are done, return t.
  -If timeout expires for one source, return nil."
  -  ;; We copy `sync-queue' here so that it remains the same object throughout
  -  ;; this function, since the slot is subject to be changed concurrently when
  -  ;; the input is edited.
  -  (alex:if-let ((sync-queue (sync-queue prompter)))
  -    (if (= (length (ready-sources sync-queue))
  -           (length (sources prompter)))
  -        t
  -        (multiple-value-bind (next-source ok)
  -            (calispel:? (ready-channel sync-queue) timeout)
  -          (cond
  -            ((not ok)
  -             nil)
  -            ((null next-source)
  -             nil)
  -            (t
  -             (push next-source (ready-sources sync-queue))
  -             ;; Update selection when update is done:
  -             (select-first prompter)
  -             next-source))))
  -    ;; No sync-queue if no input was ever set.
  -    t))
  +This is unblocked when the PROMPTER is `destroy'ed.
  +
  +TIMEOUT is deprecated."
  +  (declare (ignore timeout)) ; Deprecated.
  +  (when prompter
  +    ;; We let-bind `sync-queue' here so that it remains the same object throughout
  +    ;; this function, since the slot is subject to be changed concurrently when
  +    ;; the input is edited.
  +    (alex:if-let ((sync-queue (sync-queue prompter)))
  +      (if (= (length (ready-sources sync-queue))
  +             (length (sources prompter)))
  +          t
  +          (progn
  +            (log:info "LISTEN" prompter (ready-channel sync-queue))
  +            (calispel:fair-alt
  +              ((calispel:? (ready-channel sync-queue) next-source)
  +               (log:info "LISTENED" next-source)
  +               (cond
  +                 ((null next-source)
  +                  nil)
  +                 (t
  +                  (push next-source (ready-sources sync-queue))
  +                  ;; Update selection when update is done:
  +                  (select-first prompter)
  +                  next-source)))
  +              ((calispel:? (sync-interrupt-channel sync-queue))
  +               (log:info "LISTENING INTERRUPTED")
  +               nil))))
  +      ;; No sync-queue if no input was ever set.
  +      t)))
   
   (export-always 'all-ready-p)
   (defun all-ready-p (prompter &optional timeout)
  
positive.code:                   :type calispel:channel
                    :export nil
                    :documentation
                    "Communication channel with the `update' thread."))
    (:accessor-name-transformer (hu.dwim.defclass-star:make-name-transformer name))
    (:documentation "This object is used to memorize which sources are ready for a
  given input.
  
negative.code:         (sources prompter))
    (maybe-funcall (after-destructor prompter))
    ;; TODO: Interrupt before or after destructor?
    (calispel:! (sync-interrupt-channel (sync-queue prompter)) t)
    (calispel:! (interrupt-channel prompter) t))
  
  (export-always 'call-follow-mode-function)
  