its-it

Overview

This gem defines kernel methods its and it that queue and defer method calls. This is handy for list enumeration and case statements.

List Enumeration

its and it extend the Symbol#to_proc idiom to support chaining multiple methods.

The pure Ruby way to chain methods when enumerating a list would be:

users.collect{|user| user.contact}.collect{|contact| contact.last_name}.collect{|name| name.capitalize}

Using Symbol#to_proc, this becomes simpler:

users.collect(&:contact).collect(&:last_name).collect(&:capitalize)

And using its, this becomes becomes simpler still:

users.collect(&its.contact.last_name.capitalize)

Note that its captures arguments and blocks, allowing constructs like this, which will select users whose names include any non-hyphenated word that’s more than 10 letters long:

users.select(&its.name.split(/ /).reject{|word| word =~ /-/}.collect(&:length).max > 10)

it is an alias for its, to use with methods that describe actions rather than posessives. For example:

items.collect(&it.to_s.capitalize)

Case statements

its and it likewise extend Ruby’s code statement to support testing arbitrary methods, minimizing the need to create temporary variables and use if-elsif constructs.

In pure Ruby, doing comparisons on computed values would be done something like this:

maxlen = arrays.collect(&size).max
if maxlen > 10000
    "too big"
elsif maxlen < 10
    "too small"
else
    "okay"
end

But using it this becomes:

case arrays.collect(&size).max
when it > 1000
    "too big"
when it < 10
    "too small"
else
    "okay"
end

Of course method chanining can be used here too:

case users.first
when its.name == "Gimme Cookie" then ...
when its.name.length > 10 then ...
else ...
end

Under the hood

The ItsIt::It class starts from BlankSlate, and uses method_missing to capture and queue up all methods and their arguments, with the exception of :to_proc and :=== (and also excepting :respond_to? :to_proc and :respond_to? :===).

:to_proc returns a proc that will evaluate the method queue on a given argument. :=== takes an argument and evaluates that proc, returning the result.

Installation

Install from rubygems.org via

$ gem install "its-it"

or in a Gemfile

gem "its-it"

Compatibility

Works with MRI ruby 1.8.7, 1.9.2, 1.9.3

History

This gem is orignally based on Jay Philips’ methodphitamine gem. It has been updated to be compatible with ruby 1.9 and gemspec, added case statement support, renamed its-it, and installed on rubygems.org. Unlike methodphitamine, this gem includes only its and it, not the “maybe” monad.

Release Notes

  • 1.1.1 Remove dependency on BlankSlate