 
 ;;;;;;;;;;;;;;;;;;; fundamentals ;;;;;;;;;;;;;;;
 
+(defn ^seq seq
+  "Returns a seq on the collection. If the collection is
+  empty, returns nil.  (seq nil) returns nil. seq also works on
+  Strings."
+  [coll]
+  (when-not (nil? coll)
+    (if (satisfies? ASeq coll)
+      coll
+      (-seq coll))))
+
 (defn first
   "Returns the first item in the collection. Calls seq on its
   argument. If coll is nil, returns nil."

      (let [s (seq coll)]
        (when-not (nil? s)
          (-first s))))))

(defn ^seq next
  "Returns a seq of the items after the first. Calls seq on its


  IHash
  (-hash [coll] (hash-coll coll)))

(defn second
  "Same as (first (next x))"
