class MARC::Spec::Queries::AlNumRange

Attributes

from[R]

Attributes

to[R]

Attributes

Public Class Methods

new(from, to) click to toggle source

Initializer

# File lib/marc/spec/queries/al_num_range.rb, line 17
def initialize(from, to)
  @from, @to = parse_endpoints(from, to)
end

Public Instance Methods

alphabetic?() click to toggle source
# File lib/marc/spec/queries/al_num_range.rb, line 37
def alphabetic?
  lc_alpha?(from) || lc_alpha?(to)
end
empty?() click to toggle source
# File lib/marc/spec/queries/al_num_range.rb, line 41
def empty?
  from.nil? && to.nil?
end
include?(v) click to toggle source
# File lib/marc/spec/queries/al_num_range.rb, line 29
def include?(v)
  return false if empty?
  return (v < 0 && v > reverse_endpoint) if from.nil?
  return false if v < from

  to.nil? ? true : v <= to
end
index_range() click to toggle source
# File lib/marc/spec/queries/al_num_range.rb, line 45
def index_range
  @index_range ||= to_range
end
select_from(seq) click to toggle source

Instance methods

# File lib/marc/spec/queries/al_num_range.rb, line 24
def select_from(seq)
  raw_result = select_raw_from(seq)
  seq.is_a?(String) ? wrap_string_result(raw_result) : raw_result
end
to_s() click to toggle source

Object overrides

# File lib/marc/spec/queries/al_num_range.rb, line 52
def to_s
  "#{from || '#'}-#{to || '#'}"
end

Protected Instance Methods

equality_attrs() click to toggle source

Part

# File lib/marc/spec/queries/al_num_range.rb, line 61
def equality_attrs
  %i[from to]
end

Private Instance Methods

lc_alpha?(endpoint) click to toggle source
# File lib/marc/spec/queries/al_num_range.rb, line 96
def lc_alpha?(endpoint)
  endpoint_str = endpoint.to_s
  endpoint_str.size == 1 &&
    endpoint_str.ord >= 'a'.ord &&
    endpoint_str.ord <= 'z'.ord
end
parse_endpoints(from, to) click to toggle source
# File lib/marc/spec/queries/al_num_range.rb, line 87
def parse_endpoints(from, to)
  original_values = [from, to]
  if original_values.all? { |p| lc_alpha?(p) }
    original_values.map(&:to_s)
  else
    original_values.map { |p| int_or_nil(p) }
  end
end
reverse_endpoint() click to toggle source
# File lib/marc/spec/queries/al_num_range.rb, line 76
def reverse_endpoint
  -(1 + to)
end
select_raw_from(seq) click to toggle source
# File lib/marc/spec/queries/al_num_range.rb, line 67
def select_raw_from(seq)
  return seq if from == 0 && to.nil?
  return seq[index_range] unless alphabetic?
  return select_raw_from(seq.chars).join if seq.respond_to?(:chars)
  raise ArgumentError, "Can't select from non-sequence #{seq.inspect}" unless seq.respond_to?(:select)

  seq.select { |x| include?(x) }
end
to_range() click to toggle source
# File lib/marc/spec/queries/al_num_range.rb, line 80
def to_range
  return (0..-1) if empty?
  return (reverse_endpoint..) if from.nil?

  (from..to) # OK for to to be nil here
end