This is a companion discussion topic for the original entry at https://thoughtbot.com/upcase/videos/functors-are-more-fun-than-nil
I watched this episode only yesterday, and immediately found a use for it.
Looking through several gems that provided this feature - wrapped, maybe, ruby-maybe, and monadic - I eventually settled on monadic because I liked the syntax it provided, and also because there were some other features I could explore and learn and use later.
The immediate use for it? In a view, I render an “advanced search” form. This could be either an initial invocation (in which case everything is empty) or a results page (in which case the various search fields may be seeded with values).
If I just wanted the form to echo what the user typed I’d use a “form object” (ActiveModel) to remember their entries. But for this, I wanted more structured data echoed back - if the user selects a product category using a javascript autocomplete widget, I want to re-display the form with the actual category’s ID and name rather than whatever substring was typed.
Ie, the user starts typing “Neoprene”, and the autocomplete resolves this to “12345 - Neoprene Seat Covers”, which is the numeric ID of that category followed by something human-readable (the extra part will be discarded when “.to_i” is called on that parameter).
So, wanting to print the form when @category may or may not be nil:
%input.category-search{name: :category_id, value: Maybe(@category).id_and_name._('') }
when Maybe(@category) == Just(@category), it calls method .id_and_name, which prints the nicely formatted string that the autocomplete library (and the human user) want to see. (This is an admin app, so I don’t mind them seeing the numeric ids of things).
when Maybe( nil ) == Nothing, id_and_name returns Nothing.
Finally the “._( default )” unwraps the burrito and returns either the string (“12345 - Neoprene Seat Covers”) or, in the case of Nothing, a default value (an empty string).
It’s a fun little technique that’ll save me from typing some hugely long ternary operator expressions.
New video just out which his sortof an expansion on this one.
https://thoughtbot.com/upcase/videos/nil-is-unfriendly-with-joe-ferris