       (loop for (key value) on plist by #'cddr
             do (plist-put result key value)))
     result))
+
+(defsubst wandbox--pick (plist &rest keys)
+  "Return a new PLIST, filterd to only have values KEYS."
+  (let (obj)
+    (dolist (key keys)
+      (let ((val (plist-get plist key)))
+        (when val
+          (setq obj (plist-put obj key val)))))
+    obj))
 
 (defsubst wandbox--log (format &rest args)
   (let ((msg (apply #'format format args)))

          (setq params (plist-put params key val)))))
    params))

(defun wandbox-fetch-as-profile (src)
  "Return wandbox profile, contains (:code *SRC ...)."
  (with-temp-buffer
    (insert-file-contents src)
    (plist-put (wandbox-buffer-profile) :code (buffer-string))))

(defun wandbox-list-compilers ()
  "Return compilers available in wandbox."

                        (return (cdr (assoc "switches" x))))))
          ",")))

(defsubst wandbox--merge-profile (profile &rest functions)
  (let ((p (copy-sequence profile)))
    (dolist (f functions p)
      (setq p (wandbox-merge-plist p (apply f p))))))

(defun* wandbox-build-request-data-raw (&rest profile
                                        &key compiler options code stdin save
                                             compiler-option runtime-option
                                        &allow-other-keys)
  (labels ((join-as-string (list separator)
             (mapconcat #'(lambda (x) (format "%s" x)) list separator))
           (val (x)
