From: shevegen@... Date: 2018-09-21T22:57:53+00:00 Subject: [ruby-core:89124] [Ruby trunk Feature#15144] Enumerator#chain Issue #15144 has been updated by shevegen (Robert A. Heiler). > Obviously, the effect could be reached with flat_map I always found that name weird so ... assumingly that it is the same as .flatten.map, I always used the latter. :-) (I don't recall flat_map offhand and I happily admit that I have not googled; I try to keep ruby so simple to need only few things if possible.) > but it seems "chaining" of iterations is pretty common and clear > concept (and Google search for "ruby enumerator chain" shows > people constantly ask about the way). Well, I think this may have more to do how to name something. It may be best to actually ask matz about the "chaining" here. My personal opinion, which may be wrong, is that the term chaining is used here just to put method after method onto an object (e. g. send message after message to your object) - and have it perform the corresponding code defined in these methods. A bit like a stream of data through a pipe, a filter. If this is a correct point of view (and I really don't know; we may have to ask matz), then there should not be a need to call it a "chain" - but most definitely to not use it as a word for a new or additional method, be it .chain() or .chaining(). But again, ultimately only matz knows. By the way: [1, 2, 3].each.chain([3, 4, 5].each) The repetition of .each seems a bit awkward and the intention is also not very clear to me. But that is just my personal opinion; people write ruby code in very different ways. The above code looks alien to me too. :) ---------------------------------------- Feature #15144: Enumerator#chain https://bugs.ruby-lang.org/issues/15144#change-74143 * Author: zverok (Victor Shepelev) * Status: Open * Priority: Normal * Assignee: * Target version: ---------------------------------------- I am not sure I am not missing something, but... ```ruby [1, 2, 3].each.chain([3, 4, 5].each) # => Enumerator ``` ...seem to be a useful pattern. It especially shows itself in case of lazy enumerators, representing several long-calculated sequences, like something... ```ruby # just data from several sources, abstracted into enumerator, fetching it on demand process = URLS.lazy.map(&Faraday.method(:get))) .chain(LOCAL_FILES.lazy.map(&File.method(:read))) .chain(FALLBACK_FILE.then.lazy.map(&File.method(:read))) # with yield_self aka then we can even chain ONE value process.detect { |val| found?(val) } # uniformely search several sources (lazy-loading them) for some value # tty-progressbar is able to work with enumerables: bar = TTY::ProgressBar.new("[:bar]", total: URLS.count + LOCAL_FILES.count + 1) bar.iterate(process).detect { |val| found?(val) } # shows progress-bar for uniform process of detection ``` Prototype impl. is dead simple, of course: ```ruby class Enumerator def chain(*others) Enumerator.new { |y| [self, *others].each { |e| e.each { |v| y << v } } } end end ``` Obviously, the effect could be reached with `flat_map`, but it seems "chaining" of iterations is pretty common and clear concept (and Google search for "ruby enumerator chain" shows people constantly ask about the way). -- https://bugs.ruby-lang.org/ Unsubscribe: