require 'thread'

module WebMock
  module Util
    class Util::HashCounter
      attr_accessor :hash
      def initialize
        self.hash = {}
        @order = {}
        @max = 0
        @lock = ::Mutex.new
      end
      def put key, num=1
        @lock.synchronize do
          hash[key] = (hash[key] || 0) + num
          @order[key] = @max = @max + 1
        end
      end
      def get key
        @lock.synchronize do
          hash[key] || 0
        end
      end

      def select(&block)
        return unless block_given?
        @lock.synchronize do
          hash.select(&block)
        end
      end

      def each(&block)
        @order.to_a.sort {|a, b| a[1] <=> b[1]}.each do |a|
          block.call(a[0], hash[a[0]])
        end
      end
    end
  end
end
