Actions
Feature #21435
closedKernel#then_try as a conditional #then
    Feature #21435:
    Kernel#then_try as a conditional #then
  
Status:
Rejected
Assignee:
-
Target version:
-
Description
What¶
When chaining, I need sometimes to apply some changes conditionally, like this:
@record = Record.find(record_id)
  .then { it.respond_to?(:decorate) ? it.decorate : it }
It would be great to DRY it a bit:
@record = Record.find(record_id)
  .then_try { it.decorate if it.respond_to? :decorate }
Or, even shorter for Rails users:
@record = Record.find(record_id)
  .then_try { 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¶
# Yields self to the block and returns the result of the block if it’s
# truthy, and self otherwise.
def then_try
  tap do
    result = yield(self) or next
    break result
  end
end
Actions