Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Defines Kernel#its and Kernel#it that queue and defer method calls, simplifying list comprehension and case statements.

branch: master

This branch is 0 commits ahead and 0 commits behind master

Fetching latest commit…

Octocat-spinner-32-eaf2f5

Cannot retrieve the latest commit at this time

Octocat-spinner-32 lib
Octocat-spinner-32 spec
Octocat-spinner-32 .document
Octocat-spinner-32 .gitignore
Octocat-spinner-32 .rspec
Octocat-spinner-32 .travis.yml
Octocat-spinner-32 Gemfile
Octocat-spinner-32 LICENSE.txt
Octocat-spinner-32 README.md
Octocat-spinner-32 Rakefile
Octocat-spinner-32 its-it.gemspec
README.md

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.

Gem Version Build Status Dependency Status

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 case 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 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 http://rubygems.org via

$ gem install "its-it"

or in a Gemfile

gem "its-it"

Compatibility

Works with MRI ruby 1.8.7, 1.9.3, 2.0.0

History

Release Notes

  • 1.1.1 Remove dependency on BlankSlate

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.

Bitdeli Badge

Something went wrong with that request. Please try again.