Sha256: 89724f932c26571c7b5a046d0d6db5bd4270e24c6fe769dba4867e9cf3ca144d

Contents?: true

Size: 1.38 KB

Versions: 2

Compression:

Stored size: 1.38 KB

Contents

module TimeInterval
  class TimeWithDuration
    UNITS = %w(years months weeks days hours minutes seconds).freeze

    def self.parse(iso8601)
      halves = iso8601.split('/')

      fail ArgumentError unless halves.length == 2

      if halves[0]['P']
        forwards = false
        duration = Duration.parse(halves[0])
        time = halves[1]
      elsif halves[1]['P']
        forwards = true
        duration = Duration.parse(halves[1])
        time = halves[0]
      else
        fail ArgumentError
      end

      new Time.parse(time), duration, forwards
    end

    attr_reader :start_time
    attr_reader :duration

    def initialize(time, duration, forwards = true)
      @start_time = time
      @duration = duration
      @forwards = forwards
    end

    def ==(other)
      return false unless other.is_a? TimeWithDuration

      start_time == other.start_time && end_time == other.end_time
    end

    alias_method :eql?, :==

    def end_time
      if forwards?
        duration.add_to start_time
      else
        duration.subtract_from start_time
      end
    end

    def iso8601
      if forwards?
        "#{start_time.iso8601}/#{duration.iso8601}"
      else
        "#{duration.iso8601}/#{start_time.iso8601}"
      end
    end

    def step
      TimeWithDuration.new end_time, duration, forwards?
    end

    private

    def forwards?
      @forwards == true
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
time-interval-0.0.5 lib/time_interval/time_with_duration.rb
time-interval-0.0.4 lib/time_interval/time_with_duration.rb