class Covered::Summary

def each

def each
	@statistics = Statistics.new
	
	super do |coverage|
		@statistics << coverage
		
		if coverage.ratio < @threshold
			yield coverage
		end
	end
end

def initialize(output, threshold: 1.0)

def initialize(output, threshold: 1.0)
	super(output)
	
	@statistics = nil
	
	@threshold = threshold
end

def print_partial_summary(output = $stdout, before: 4, after: 4)

def print_partial_summary(output = $stdout, before: 4, after: 4)
	statistics = Statistics.new
	
	self.each do |coverage|
		line_offset = 1
		output.puts "", Rainbow(coverage.path).bold.underline
		
		counts = coverage.counts
		
		File.open(coverage.path, "r") do |file|
			file.each_line do |line|
				range = Range.new([line_offset - before, 0].max, line_offset+after)
				
				if counts[range]&.include?(0)
					count = counts[line_offset]
					
					prefix = "#{line_offset} ".rjust(8) + "#{count} ".rjust(8)
					
					if count == nil
						output.write prefix
						output.write Rainbow(line).faint
					elsif count == 0
						output.write Rainbow(prefix).background(:darkred)
						output.write Rainbow(line).red
					else
						output.write Rainbow(prefix).background(:darkgreen)
						output.write Rainbow(line).green
					end
					
					# If there was no newline at end of file, we add one:
					unless line.end_with? $/
						output.puts
					end
				end
				
				line_offset += 1
			end
		end
		
		coverage.print_summary(output)
	end
	
	output.puts
	@statistics.print_summary(output)
end

def print_summary(output = $stdout)

A coverage array gives, for each line, the number of line execution by the interpreter. A nil value means coverage is disabled for this line (lines like else and end).
def print_summary(output = $stdout)
	self.each do |coverage|
		line_offset = 1
		output.puts "", Rainbow(coverage.path).bold.underline
		
		counts = coverage.counts
		
		File.open(coverage.path, "r") do |file|
			file.each_line do |line|
				count = counts[line_offset]
				
				output.write("#{line_offset}|".rjust(8))
				output.write("#{count}:".rjust(8))
				
				if count == nil
					output.write Rainbow(line).faint
				elsif count == 0
					output.write Rainbow(line).red
				else
					output.write Rainbow(line).green
				end
				
				# If there was no newline at end of file, we add one:
				unless line.end_with? $/
					output.puts
				end
				
				line_offset += 1
			end
		end
		
		coverage.print_summary(output)
	end
	
	@statistics.print_summary(output)
end