hawkeye
hawkeye

Reputation: 35702

Optimal way to iterate over a core.async channel for printing?

I'm trying to dump the results of a core.async channel to stdout.

Here is what I have (simplified example):

(use 'clojure.core.async)

(def mychan (to-chan (range 100)))

(loop []
  (let [a (<!! mychan)]
    (if (not (nil? a))
      (do  
        (println a)
        (recur)))))

Now I think I should be able to replace this with map:

(map (fn [a] (println a) a) [mychan])

But this seems to be lazy and doesn't return any results.

I can't help but feel that my loop function is somewhat of a workaround. My question is - What is the optimal way to iterate over a core.async channel for printing?

Upvotes: 3

Views: 1429

Answers (1)

edbond
edbond

Reputation: 3951

Better use go-loop to run logging process in go block:

(def c (async/chan 10))
(go-loop []
  (when-let [msg (<! c)]
    (println msg)
    (recur)))
(async/onto-chan c (range 100))

or you can use transducers on 1.7

(def prn-chan (async/chan 10 (map println)))
(async/onto-chan prn-chan (range 100))

Upvotes: 4

Related Questions