From: "matheusrich (Matheus Richard) via ruby-core" <ruby-core@...>
Date: 2024-08-28T14:07:01+00:00
Subject: [ruby-core:118978] [Ruby master Feature#20664] Add `before` and `until` options to Enumerator.produce

Issue #20664 has been updated by matheusrich (Matheus Richard).


The kwargs proposed here could be useful:

```rb
sequence.take_until(inclusive: true, &:terminator?)
```

Alternatively, we could always be inclusive and let people `pop` to remove the last element:

```rb
sequence.take_until(&:terminator?).pop
```

----------------------------------------
Feature #20664: Add `before` and `until` options to Enumerator.produce
https://bugs.ruby-lang.org/issues/20664#change-109551

* Author: knu (Akinori MUSHA)
* Status: Open
----------------------------------------
Enumerator.produce provides a nice way to generate an infinite sequence but is a bit awkward to define how to end a sequence.  It lacks a simple and easy way to produce typical finite sequences in an intuitive syntax.

This proposal attempts to solve the problem by adding these two options to the method:

- `before`: when provided, it is used as a predicate to determine if an iteration should end before a generated value gets yielded.
- `until`: when provided, it is used as a predicate to determine if an iteration should end until after a generated value gets yielded.

Any value that responds to `to_proc` and returns a `Proc` object is accepted in these options.

A typical use case for the `before` option is traversing a tree structure to iterate over the ancestors or following/preceding siblings of a node.

The `until` option can be used when there is a clear definition of the "last" value to yield.

```ruby
enum = Enumerator.produce(File, before: :nil?, &:superclass)
enum.to_a #=> [File, IO, Object, BasicObject]

enum = Enumerator.produce(3, until: :zero?, &:pred)
enum_to_a #=> [3, 2, 1, 0]
```

---Files--------------------------------
0001-Add-before-and-until-options-to-Enumerator.produce.patch (10.7 KB)


-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/