class Term

Constants

VERSION

Attributes

from[RW]
to[RW]

Public Class Methods

new(from:, to:) click to toggle source
# File lib/term.rb, line 7
def initialize(from:, to:)
  pre_validate!(from, to)
  @from, @to = parse_arguments(from, to)
  post_validate!
end

Public Instance Methods

==(target) click to toggle source
# File lib/term.rb, line 13
def ==(target)
  from == target.from && to == target.to ? true : false
end
overlap_with(target) click to toggle source
# File lib/term.rb, line 43
def overlap_with(target)
  return nil unless overlap_with?(target)

  if perfectly_indefinite?
    Term.new(from: target.from, to: target.to)
  elsif target.perfectly_indefinite?
    Term.new(from: from, to: to)
  elsif from_indefinite?
    if target.from_indefinite?
      Term.new(to: [to, target.to].min)
    elsif target.to_indefinite?
      Term.new(from: target.from, to: to)
    else
      Term.new(from: target.from, to: [to, target.to].min)
    end
  elsif to_indefinite?
    if target.from_indefinite?
      Term.new(from: from, to: target.to)
    elsif target.to_indefinite?
      Term.new(from: [from, target.to].max)
    else
      Term.new(from: [from, target.from].max, to: target.to)
    end
  else
    if target.from_indefinite?
      Term.new(from: from, to: [to, target.to].min)
    elsif target.to_indefinite?
      Term.new(from: [from, target.from].max, to: to)
    else
      Term.new(from: [from, target.from].max, to: [to, target.to].min)
    end
  end
end
overlap_with?(target) click to toggle source
# File lib/term.rb, line 17
def overlap_with?(target)
  if perfectly_indefinite? || target.perfectly_indefinite?
    true
  elsif from_indefinite?
    if target.from_indefinite?
      true
    else
      to >= target.from ? true : false
    end
  elsif to_indefinite?
    if target.to_indefinite?
      true
    else
      from <= target.to ? true : false
    end
  else
    if target.from_indefinite?
      from <= target.to ? true : false
    elsif target.to_indefinite?
      to >= target.from ? true : false
    else
      from <= target.to && to >= target.from ? true : false
    end
  end
end

Protected Instance Methods

from_indefinite?() click to toggle source
# File lib/term.rb, line 79
def from_indefinite?
  from.nil?
end
indefinite?() click to toggle source
# File lib/term.rb, line 87
def indefinite?
  from_indefinite? || to_indefinite?
end
perfectly_indefinite?() click to toggle source
# File lib/term.rb, line 91
def perfectly_indefinite?
  from_indefinite? && to_indefinite?
end
to_indefinite?() click to toggle source
# File lib/term.rb, line 83
def to_indefinite?
  to.nil?
end

Private Instance Methods

parse_arguments(from, to) click to toggle source
# File lib/term.rb, line 105
def parse_arguments(from, to)
  return DateTime.parse(from), DateTime.parse(to) if from.is_a?(String)
  [from, to]
end
post_validate!() click to toggle source
# File lib/term.rb, line 110
def post_validate!
  return if indefinite?
  raise ArgumentError, "from must be earlier than to" if from > to
end
pre_validate!(from, to) click to toggle source
# File lib/term.rb, line 97
def pre_validate!(from, to)
  [from, to].each do |date|
    raise ArgumentError, "from and to must be a kind of Time, DateTime, String, or NilClass class" unless proper_class?(date)
  end
  return if from.nil? || to.nil?
  raise ArgumentError, "from and to must be the same class or at leaset one of them is nil" unless same_class?(from, to)
end
proper_class?(date) click to toggle source
# File lib/term.rb, line 119
def proper_class?(date)
  [String, DateTime, Time, NilClass].any? {|klass| klass == date.class}
end
same_class?(from, to) click to toggle source
# File lib/term.rb, line 115
def same_class?(from, to)
  from.class == to.class
end