             (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

(ns semantic-csv.transducers
  (:require [clojure.java.io :as io]
            [clojure-csv.core :as csv]
            [semantic-csv.impl.core :as impl :refer [?>>]]))

(defn mappify
  "Takes a sequence of row vectors, as commonly produced by csv parsing libraries, and returns a sequence of

    (transduce (process rest-options) conj []
     (impl/apply-kwargs csv/parse-csv csv-readable parser-opts))))

;;     (with-open [in-file (io/reader "test/test.csv")]
;;         (parse-and-process in-file
;;                            :cast-fns {:this #(Integer/parseInt %)}))


;; <br/>
;; ## slurp-csv

(defn slurp-csv
  "This convenience function let's you `parse-and-process` csv data given a csv filename. Note that it is _not_
  lazy, and must read in all data so the file handle can be closed."
