def group_by
groups = []

inject({}) do |grouped, element|
index = yield(element)

if group = grouped[index]
group << element
else
group = [element]
groups << [index, group]
grouped[index] = group
end

grouped
end

groups
end if RUBY_VERSION < '1.9'