Feature #21435
Updated by Alexander.Senko (Alexander Senko) 5 months ago
## What
When chaining, I need sometimes to apply some changes conditionally, like this:
```ruby
@record = Record.find(record_id)
.then { it.respond_to?(:decorate) ? it.decorate : it }
```
It would be great to DRY it a bit:
```ruby
@record = Record.find(record_id)
.then_try .optional { it.decorate if it.respond_to? :decorate }
```
Or, even shorter for Rails users:
```ruby
@record = Record.find(record_id)
.then_try .optional { it.try :decorate }
```
## Why
The intent is to **make it visible at a glance that a statement _may_ affect the result**, but not necessarily does so. Without the proposed method, one needs to read and parse the whole block to know that.
It should help to read longer processing chains, for those who prefer chains and `#then` to plain old iterative approach.
## Naming
It is discussible. I have just two ideas yet:
- `then_try`
- `optional`
- `maybe`
## Reference implementation
```ruby
# Yields self to the block and returns the result of the block if it’s
# truthy, and self otherwise.
def then_try optional
tap do
result = yield(self) or next
break result
end
end
```