(use 'clojure.core.async) ;this is the function you want to use (defn lazy-channels [chs] (lazy-seq (cons (let [ [v _] (alts!! chs)] v) (lazy-channels chs)))) ;now for the tesging (def chs [ (chan) (chan) (chan) ]) ; the channels can come from anywhere, here we are using three channels for testing (thread (dotimes [i 1000] (>!! (rand-nth chs) (str "m-" i)))) ;add 1000 elements to a random selection of channels ;create a sequence (def s (lazy-channels chs)) ;now consume, please note that this will block when no more data is available on the channels (doseq [msg s] (prn msg))