anchor.diff:    (when (or (not (uiop:file-exists-p (expand-path (path hostlist))))
               (< (update-interval hostlist)
                  (- (get-universal-time) (uiop:safe-file-write-date (expand-path (path hostlist))))))
  -    (update-hostlist-with-lock hostlist))
  +    (update-hostlist-with-lock hostlist mode))
     (handler-case
         (uiop:read-file-string (expand-path (path hostlist)))
       (error ()
         (log:warn "Hostlist not found: ~a" (expand-path (path hostlist)))
         nil)))
   
  -(defmethod parse ((hostlist hostlist))
  -  "Return the hostlist as a list of strings.
  -Return nil if hostlist cannot be parsed."
  -  ;; We could use a hash table instead, but a simple benchmark shows little difference.
  -  (setf (hosts hostlist)
  -        (or (hosts hostlist)
  -            (let ((hostlist-string (read-hostlist hostlist)))
  -              (unless (uiop:emptyp hostlist-string)
  -                (with-input-from-string (stream hostlist-string)
  -                  (flet ((empty-line? (line)
  -                           (< (length line) 2))
  -                         (comment? (line)
  -                           (string= (subseq line 0 1) "#"))
  -                         (custom-hosts? (line)
  -                           (not (str:starts-with? "0.0.0.0" line))))
  -                    (loop as line = (read-line stream nil)
  -                          while line
  -                          unless (or (empty-line? line)
  -                                     (comment? line)
  -                                     (custom-hosts? line))
  -                            collect (second (str:split " " line))))))))))
  +(defmethod load-hostlist ((hostlist-string string) mode)
  +  "Load HOSTLIST-STRING into MODE's `blocked-hosts'."
  +  (unless (uiop:emptyp hostlist-string)
  +    (with-input-from-string (stream hostlist-string)
  +      (flet ((empty-line? (line)
  +               (< (length line) 2))
  +             (comment? (line)
  +               (string= (subseq line 0 1) "#"))
  +             (custom-hosts? (line)
  +               (not (str:starts-with? "0.0.0.0" line))))
  +        (loop as line = (read-line stream nil)
  +              while line
  +              unless (or (empty-line? line)
  +                         (comment? line)
  +                         (custom-hosts? line))
  +                do (let ((host (second (str:split " " line))))
  +                     (setf (gethash host (blocked-hosts mode)) host)))))))
  +
  +(defmethod load-hostlist ((hostlist hostlist) mode)
  +  "Load HOSTLIST into MODE's `blocked-hosts'."
  +  (let ((hostlist-string (read-hostlist hostlist mode)))
  +    (load-hostlist hostlist-string mode)))
   
   (serapeum:export-always '*default-hostlist*)
   (defparameter *default-hostlist*
  
positive.code: \(define-configuration buffer
    ((default-modes (append '(my-blocker-mode) %slot-default%))))"
    ((hostlists (list *default-hostlist*))
     (destructor
      (lambda (mode)
        (when (web-buffer-p (buffer mode))
  
negative.code: See the `hostlist' class documentation."
    (apply #'make-instance 'hostlist args))
  
  (defmethod update ((hostlist hostlist) mode)
    "Fetch HOSTLIST and return it.
  If HOSTLIST has a `path', persist it locally."
    (unless (uiop:emptyp (url hostlist))
  