Welcome! Please see the About page for a little more info on how this works.

+1 vote
in core.async by

completion arity (1) of a transducer function is called twice in a channel

`
(let [xf (fn [rf]

       (fn
         ([] (println "INIT") (rf))
         ([result] (println "COMPLETING") (rf result))
         ([result input] (println "STEP") (rf result input))))
  c (chan 10 xf)]

(close! c)
(println "RESULT" (<!! c)))
`

will print

COMPLETING COMPLETING RESULT nil

According to https://clojure.org/reference/transducers, it is probably a bug:

A completing process must call the completion operation on the final accumulated value exactly once

Looks like completing fn is called at there places in core.async: https://github.com/clojure/core.async/blob/master/src/main/clojure/cljs/core/async/impl/channels.cljs#L122 https://github.com/clojure/core.async/blob/master/src/main/clojure/cljs/core/async/impl/channels.cljs#L146

2 Answers

0 votes
by

Comment made by: jwr

I can confirm that I also encountered this and was surprised by the behavior.

0 votes
by
Reference: https://clojure.atlassian.net/browse/ASYNC-183 (reported by wagjo)
...