You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.3 KiB
54 lines
1.3 KiB
# frozen_string_literal: true
|
|
|
|
class Zones
|
|
def initialize(watch_low_benchmark:, growth_low_benchmark:, approval_low_benchmark:, ideal_low_benchmark:)
|
|
@watch_low_benchmark = watch_low_benchmark
|
|
@growth_low_benchmark = growth_low_benchmark
|
|
@approval_low_benchmark = approval_low_benchmark
|
|
@ideal_low_benchmark = ideal_low_benchmark
|
|
@warning_low_benchmark = 1
|
|
end
|
|
|
|
Zone = Struct.new(:low_benchmark, :high_benchmark, :type) do
|
|
def contains?(number)
|
|
return false if number.nil? || number.is_a?(Float) && number.nan?
|
|
|
|
number.between?(low_benchmark, high_benchmark)
|
|
end
|
|
end
|
|
|
|
def all_zones
|
|
[
|
|
ideal_zone, approval_zone, growth_zone, watch_zone, warning_zone, insufficient_data
|
|
]
|
|
end
|
|
|
|
def warning_zone
|
|
Zone.new(1, @watch_low_benchmark, :warning)
|
|
end
|
|
|
|
def watch_zone
|
|
Zone.new(@watch_low_benchmark, @growth_low_benchmark, :watch)
|
|
end
|
|
|
|
def growth_zone
|
|
Zone.new(@growth_low_benchmark, @approval_low_benchmark, :growth)
|
|
end
|
|
|
|
def approval_zone
|
|
Zone.new(@approval_low_benchmark, @ideal_low_benchmark, :approval)
|
|
end
|
|
|
|
def ideal_zone
|
|
Zone.new(@ideal_low_benchmark, 5.0, :ideal)
|
|
end
|
|
|
|
def insufficient_data
|
|
Zone.new(Float::MIN, Float::MAX, :insufficient_data)
|
|
end
|
|
|
|
def zone_for_score(score)
|
|
all_zones.find { |zone| zone.contains?(score) } || insufficient_data
|
|
end
|
|
end
|