module Enumerable
  def uniq_by(&block)
    uniq = {}
    each_with_index do |val, idx|
      key = block.call(val)
      uniq[key] = [idx, val]
    end
    values = uniq.values
    values.sort!{|a,b| a.first <=> b.first}
    values.map!{|pair| pair.last}
    values
  end
end

p  [ [0,1], [0,2], [1,0], [1,2] ].uniq_by{|a| a.first} #=> [[0, 2], [1, 2]]