class Naturally::Segment

An entity which can be compared to other like elements for sorting. It's an object representing a value which implements the {Comparable} interface which can convert itself to an array.

Public Class Methods

new(v) click to toggle source
# File lib/naturally/segment.rb, line 9
def initialize(v)
  @val = v
end

Public Instance Methods

<=>(other) click to toggle source
# File lib/naturally/segment.rb, line 13
def <=>(other)
  to_array <=> other.to_array
end
to_array() click to toggle source

@return [Array] a representation of myself in array form

which enables me to be compared against
another instance for sorting.
The array is prepended with a symbol so
two arrays are always comparable.

@example a simple number

Segment.new('10').to_array #=> [:int, 10]

@example a college course code

Segment.new('MATH101').to_array #=> [:str, "MATH", 101]

@example Section 633a of the U.S. Age Discrimination in Employment Act

Segment.new('633a').to_array #=> [:int, 633, "a"]
# File lib/naturally/segment.rb, line 31
def to_array
  # TODO: Refactor, probably via polymorphism
  if @val =~ /^(\p{Digit}+)(\p{Alpha}+)$/
    [:int, $1.to_i, $2]
  elsif @val =~ /^(\p{Alpha}+)(\p{Digit}+)$/
    [:str, $1, $2.to_i]
  elsif @val =~ /^\p{Digit}+$/
    [:int, @val.to_i]
  else
    [:str, @val]
  end
end