             (if (and x (commented? x))
               results
               (rf results input)))))))))
+
+;; Notice the remove-comments is placed before mappify.
+;; We want this done in order.  The order flows from left to right in the compose.
+;; This is a property of transducers.
+;;
+;;     => (with-open [in-file (io/reader "test/test.csv")]
+;;          (transduce
+;;            (comp (remove-comments) (mappify))
+;;            conj
+;;            []
+;;            (csv/parse-csv in-file)))
+;;
+;;     ({:this "1", :that "2", :more "stuff"}
+;;      {:this "2", :that "3", :more "other yeah"})
+;;
+;; <br/>
+;; Next, let's observe that `:this` and `:that` point to strings, while they should really be pointing to
+;; numeric values.
+;; This can be addressed with the following function:
+
+;; <br/>
+;; ## cast-with
 
 (defn cast-with
   "Casts the vals of each row according to `cast-fns`, which must either be a map of

                results)
            (rf results (apply struct (apply create-struct @hdr) input)))))))))

(defn remove-comments
  "Removes rows which start with a comment character (by default, `#`). Operates by checking whether
  the first item of every row in the collection matches a comment pattern. Also removes empty lines.

  ([]
   (process {})))

;; Using this function, the code we've been building above is reduced to the following:
;;
;;     (with-open [in-file (io/reader "test/test.csv")]
;;       (transduce
;;         (process {:cast-fns {:this #(Integer/parseInt %)}})
;;         conj
;;         []
;;         (csv/parse-csv in-file)))


;; <br/>
;; ## parse-and-process

(defn parse-and-process
  "This is a convenience function for reading a csv file using `clojure/data.csv` and passing it through `process`
  with the given set of options (specified _last_ as kw_args, in contrast with our other processing functions).
