Project

General

Profile

Feature #21435

Updated by Alexander.Senko (Alexander Senko) 2 days 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) 
   .optional { it.decorate if it.respond_to? :decorate } 
 ``` 

 Or, even shorter for Rails users: 
 ```ruby 
 @record = Record.find(record_id) 
   .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: 
 - `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 optional 
   tap do 
     result = yield(self) or next 

     break result 
   end 
 end 
 ```

Back