            (recur more (put ch v)))))))
 
 (defn close
+  "Close a channel. Closing a channel causes any associated
+  asynchronous sequences to terminate."
   [ch]
   (.close (.transfer ch)))
 

            (cons v nxt)))))))

(defn channel
  ([]  (channel nil 0))
  ([f] (channel f 1))
  ([f capacity]

             coll))))))

(defn map*
  "Returns an asynchronous sequence consisting of the result of recursively
  applying f to the set of first items of each coll once they become
  realized. Function f should accept the number of colls arguments."
  ([f coll]
     (async-seq
       (doasync coll
         (fn [[v & more]]
           (cons v (map* f more))))))
  ([f c1 & colls]
     (throw (Exception. "Not implemented yet."))))

(defmacro doseq*
  "Repeatedly executes body (presumably for side-effects) with
  bindings as they are realized and filtering as provided by
  \"for\". Does not retain the head of the sequence. Returns an
  asynchronous value that will be realized with nil once all of the
  items have been handled."
  [seq-exprs & body]
  (assert (vector? seq-exprs) "a vector for its binding")
  (assert (even? (count seq-exprs)) "an even number of forms in binding vector")
