   ([]
    (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).

                results)
            (rf results (impl/mappify-row @hdr input)))))))))

(defn structify
  "Takes a sequence of row vectors, as commonly produced by csv parsing libraries, and returns a sequence of
  structs. By default, the first row vector will be interpreted as a header, and used as the keys for the maps.
  However, this and other behaviour are customizable via an optional `opts` map with the following options:
 
  * `:keyify` - bool; specify whether header/column names should be turned into keywords (default: `true`).
  * `:header` - specify the header to use for map keys, preventing first row of data from being consumed as header."
  ([] (structify {}))

            (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
