I don’t know; I don’t fully understand the implementation differences of >!! and offer!. The behavior of offer! makes me think the buffer is not empty until all the outputs of the transducer are consumed, but the behavior of >!! makes me think otherwise.
Moritz - is the buffer cleared if: - it’s size is 1 - you’ve put 1 item onto the channel - that 1 item is transformed into 3 by the channel’s transducer - and only 1 of the 3 items are taken from the channel? Per the docstrings and the behavior it’s both not possible to put another value onto the channel immediately (so offer! returns nil) yet buffer space is available after only 1 of the 3 values on the channel are taken (so >!! doesn't block). https://github.com/clojure/core.async/blob/master/src/main/clojure/clojure/core/async.clj#L138 <https://github.com/clojure/core.async/blob/master/src/main/clojure/clojure/core/async.clj#L138> https://github.com/clojure/core.async/blob/master/src/main/clojure/clojure/core/async.clj#L391 <https://github.com/clojure/core.async/blob/master/src/main/clojure/clojure/core/async.clj#L391> This seems like a weird corner case made possible by transducers. Maybe the collection put into the buffer is removed from the buffer and passed to the transducer on the first take, so the buffer is empty and that’s all >!! cares about, yet there are still values to be taken from the channel (from the transducer — not the buffer) and somehow that affects offer!’s behavior. > On Jan 5, 2018, at 4:07 PM, Rob Nikander <rob.nikan...@gmail.com> wrote: > > > > On Friday, January 5, 2018 at 4:00:25 PM UTC-5, Moritz Ulrich wrote: > > You have a channel with a buffer-size of one. You clear the buffer by > taking one item from it, making room for another one. Therefore the put > succeeds. Try just `(async/chan nil xform)` to create a channel without > a backing buffer (a rendezvouz channel) where puts only succeed if > there's a matching consumer. > > Then why does Brian's code work the way it does? See how he takes 2 things > off the channel, and offer! still fails and returns nil. If offer! is > returning nil, shouldn't >!! be blocking? > > > > > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with your > first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > <http://groups.google.com/group/clojure?hl=en> > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com > <mailto:clojure+unsubscr...@googlegroups.com>. > For more options, visit https://groups.google.com/d/optout > <https://groups.google.com/d/optout>. -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.