        (constructor item))))
 
 (defn mapvals
-  "Return map `m`, with each value transformed by function `f`"
-  [f m]
-  (into {} (concat (for [[k v] m]
-                     [k (f v)]))))
+  "Return map `m`, with each value transformed by function `f`.
+
+  You may also provide an optional list of keys `ks`; if provided, only the
+  specified keys will be modified."
+  ([f m]
+    (mapvals f m (keys m)))
+  ([f m ks]
+    (reduce (fn [m k] (update-in m [k] f)) m ks)))
 
 (defn mapkeys
   "Return map `m`, with each key transformed by function `f`"

        [clojure.set :only (difference union)]
        [clojure.stacktrace :only (print-cause-trace)]
        [clj-time.core :only [now]]
        [clj-time.coerce :only [ICoerce]]
        [clj-time.format :only [formatters unparse]]
        [slingshot.slingshot :only (try+ throw+)]))

;; ## I/O


  (set (vals m)))

;; ## Date and Time

(defn timestamp
  "Returns a timestamp string for the given `time`, or the current time if none
