 ;; ## cast-with
 
 (defn cast-with
-  "Casts the vals of each row according to `cast-fns`, which must either be a map of
-  `column-name -> casting-fn` or a single casting function to be applied towards all columns.
-  Additionally, an `opts` map can be used to specify:
+  "Returns a transducer that casts the vals of each row according to `cast-fns`, which must either
+  be a map of `column-name -> casting-fn` or a single casting function to be applied towards all columns.
+  Options include:
 
   * `:except-first` - Leaves the first row unaltered; useful for preserving header row.
   * `:exception-handler` - If cast-fn raises an exception, this function will be called with args

;; ## 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:

  * `: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 {}))
  ([{:keys [keyify transform-header header] :or {keyify true} :as opts}]
   (fn [rf]

;; ## process

(defn process
  "Returns a transducers that composes the most frequently used input processing capabilities,
  and is 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`).
