 ;; ## structify
 
 (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 structs.
-  However, this and other behaviors are customizable via an optional `opts` map with the following options:
+  "Takes a set of input options and returns a transducer.  The transducers will use the supplied header,
+  or the first row if :header is nil, to create a struct for each row, where the keys for the struct are the header values.
+  Options include:
 
   * `: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."
+  * `:header` - specify the header to use for struct keys, preventing first row of data from being consumed as header."
   ([] (structify {}))
   ([{:keys [keyify transform-header header] :or {keyify true} :as opts}]
    (fn [rf]

;; ## process

(defn process
  "This function wraps together the most frequently used input processing capabilities,
  controlled by an `opts` hash with opinionated defaults:

  * `:mappify` - bool; transform rows from vectors into maps using `mappify`.
  * `:keyify` - bool; specify whether header/column names should be turned into keywords (default: `true`).

;; ## parse-and-process

(defn parse-and-process
  "This is a convenience function for reading a csv file using `clojure-csv` and passing it through `process`
  with the given set of options (specified _last_ as kw_args, in contrast with our other processing functions).
  Note that `:parser-opts` can be specified and will be passed along to `clojure-csv/parse-csv`"
  [csv-readable & {:keys [parser-opts]
