class RangeClassifier

Attributes

projection[R]

Public Class Methods

new(projection=RangeClassifier.id, ranges: []) click to toggle source
# File lib/range_classifier.rb, line 4
def initialize(projection=RangeClassifier.id, ranges: [])
  @projection = projection
  @ranges = ranges
end

Private Class Methods

id() click to toggle source
# File lib/range_classifier.rb, line 35
def self.id
  -> (v) {[v, v]}
end

Public Instance Methods

append_lower_stream(stream, low: nil) click to toggle source
# File lib/range_classifier.rb, line 14
def append_lower_stream(stream, low: nil)
  stream.each do |high, result|
    @ranges << {
      lower: [low, high],
      result: result
    }
    low = high
  end
  self
end
append_ranges(ranges) click to toggle source
# File lib/range_classifier.rb, line 9
def append_ranges(ranges)
  @ranges.concat(ranges)
  self
end
classify(element, *args) click to toggle source
# File lib/range_classifier.rb, line 25
def classify(element, *args)
  lkey, ukey = @projection.call(element, *args)
  selected = @ranges.find { |range|
    matches_section(range[:lower], lkey) && matches_section(range[:upper], ukey)
  }
  selected[:result]
end

Private Instance Methods

matches_section(range, key) click to toggle source
# File lib/range_classifier.rb, line 39
def matches_section(range, key)
  return true if range.nil?
  l, u = range
  (l.nil? || l <= key) && (u.nil? || u >= key)
end