require 'thread'
require './min_max.rb'

class NumericQueue < Queue
	attr_accessor :sorting
	attr_reader :elements, :sum, :min, :max

	def initialize *p
		super *p
		@elements = 0
		@sum = 0
		@min = nil
		@max = nil
		@sorting = false
		@sorted = []
		@counter = 0
	end
	
	def med
		raise "Sorting is not enabled." unless @sorting
		raise "Queue is empty!" if @sorted.empty?
#		puts @sorted.inspect
		return case @sorted.length % 2
			when 0
				(@sorted[@sorted.length / 2 - 1] + @sorted[@sorted.length / 2]) / 2
			when 1
				@sorted[@sorted.length / 2]
		end
	end

	def push e
		super e
		@counter += 1
		@elements += 1
		@sum += e
		@min = e if @min.nil? || e < @min
		@max = e if @max.nil? || @max < e
		if @sorting
			smaller = 0
			@sorted.each { |i|
				break if e < i
				smaller += 1
			}
			@sorted.insert(smaller, e)
=begin			
			a = []
			inserted = false
			
			@sorted.each { |i|
				if e < i and not inserted
					a << e
					inserted = true
				end
				a << i
			}
			@sorted = a
=end
		end
	end
	
	def pop
		value = super
		@elements -= 1
		@sum -= value
		@min = (@que.length > 0)?find_min(@que):nil if value == @min
		@max = (@que.length > 0)?find_max(@que):nil if value == @max
		if @sorting
			dropped = false
			@sorted.delete_if { |i| (not dropped) && (dropped = (i == value)) }
		end
		return value
	end
	
	def avg
		@sum / @elements
	end
end
