   also works for strings, arrays, regex Matchers and Lists, and,
   in O(n) time, for sequences."
   ([coll n]
-     (if (indexed? coll)
+     (if (satisfies? IIndexed coll)
        (-nth coll (.floor js/Math n))
        (linear-traversal-nth coll (.floor js/Math n))))
   ([coll n not-found]
-     (if (indexed? coll)
+     (if (satisfies? IIndexed coll)
        (-nth coll (.floor js/Math n) not-found)
        (linear-traversal-nth coll (.floor js/Math n) not-found))))
 

  "Returns true if coll implements nth in constant time"
  [x] (satisfies? IIndexed x))

(defn ^boolean reducible?
  "Returns true if coll satisfies IReduce"
  [x] (satisfies? IReduce x))


  applying f to that result and the 2nd item, etc. If coll contains no
  items, returns val and f is not called."
  ([f coll]
     (if (satisfies? IReduce coll)
       (-reduce coll f)
       (seq-reduce f coll)))
  ([f val coll]
     (if (satisfies? IReduce coll)
       (-reduce coll f val)
       (seq-reduce f val coll))))

