マージソートの sort_by

マージソートシリーズ最終回。

module Enumerable
  def msort_by
    map{|i| MSORT.new(yield(i), i) }.msort {|a,b| a.key <=> b.key }.
      map{|i| i.val}
  end

  private
  MSORT = Struct.new(:key, :val)
end

["3a", "1b", "4c", "1d", "5e", "9f"].msort_by{|v| v.to_i}
# => ["1b", "1d", "3a", "4c", "5e", "9f"]

これでブロックなし、ブロック付き、sort_by の 3 種類が揃って Ruby らしくなった。