title: Why clojure collections don't implement ISeq interface directly?
body: <p>Every collection in clojure is said to be "sequable" but only list and cons are actually seqs:</p>
  
  <pre><code>user&gt; (seq? {:a 1 :b 2})
  false
  user&gt; (seq? [1 2 3])
  false    
  </code></pre>
  
  <p>All other <a href="http://clojure.org/sequences" rel="noreferrer">seq functions</a> first convert a collection to a sequence and only then operate on it.</p>
  
  <pre><code>user&gt; (class (rest {:a 1 :b 2}))
  clojure.lang.PersistentArrayMap$Seq
  </code></pre>
  
  <p>I cannot do things like:</p>
  
  <pre><code>user&gt; (:b (rest {:a 1 :b 2}))
  nil
  user&gt; (:b (filter #(-&gt; % val (= 1)) {:a 1 :b 1 :c 2}))
  nil
  </code></pre>
  
  <p>and have to coerce back to concrete data type. This looks like bad design to me, but most likely I just don't get it as yet.</p>
  
  <p>So, why clojure collections don't implement ISeq interface directly and all seq functions don't return an object of the same class as the input object?</p>