anchor.diff:           (setf (entries merge) (fset:map-union (entries keymap2) (entries keymap1)))
            (apply #'compose merge (rest (rest keymaps))))))))
   
  +(declaim (ftype (function (symbol keymap) (types:proper-list string)) symbol-keys*))
   (defun symbol-keys* (symbol keymap)
     "Return a the list of `keyspec's bound to SYMBOL in KEYMAP.
   The list is sorted alphabetically to ensure reproducible results."
  
positive.code:         (push key result)))
      (sort result #'string<)))
  
  (defun symbol-keys (symbol &rest keymaps) ; TODO: Return hash-table or alist?
    "Return a the list of `keyspec's bound to SYMBOL in KEYMAP."
    (alex:mappend (lambda (keymap)
                    (let ((hit (symbol-keys* symbol keymap)))
                      (when hit
                        (mapcar (alex:rcurry #'list keymap) hit))))
                  keymaps))
  
  ;; TODO: Remap binding, e.g.
  ;; (define-key *foo-map* (remap 'bar-sym) 'new-sym)
  
negative.code:                                        (parents keymap)))))))
      (apply #'keymap->map (list-keymaps keymap '()))))
  
  (declaim (ftype (function (&rest keymap) (or keymap nil)) compose))
  (defun compose (&rest keymaps)
    "Return a new keymap that's the composition of all given KEYMAPS.
  KEYMAPS are composed by order of precedence, first keymap being the one with
  