                           (.getColumnNumber ^LineNumberingPushbackReader rdr))
                         (fn [rdr] 0))})
 
+;; fast check for provided implementations
+(defn indexing-reader? [rdr]
+  (or (instance? clojure.tools.reader.IndexingReader rdr)
+      (instance? clojure.lang.LineNumberingPushbackReader rdr)
+      (and (not (instance? clojure.tools.reader.StringReader rdr))
+           (not (instance? clojure.tools.reader.InputStreamReader rdr))
+           (get (:impls IndexingReader) (class rdr)))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; predicates


(defn read-list
  [rdr _]
  (let [[line column] (when (instance? clojure.tools.reader.IndexingReader rdr)
                        [(get-line-number rdr) (dec (get-column-number rdr))])
        the-list (read-delimited-list \) rdr true)]
    (if (empty? the-list)

  [rdr & msg]
  (throw (ex-info (apply str msg)
                  (merge {:type :reader-exception}
                         (if (indexing-reader? rdr)
                           {:line (get-line-number rdr)
                            :column (get-column-number rdr)})))))

