class HolidaysFromGoogleCalendar::Cache

Attributes

size[R]

Public Class Methods

new(enable: nil, max_size: nil) click to toggle source
# File lib/holidays_from_google_calendar/cache.rb, line 5
def initialize(enable: nil, max_size: nil)
  @enable = enable
  @max_size = max_size
  @container = []
  calculate_size
end

Public Instance Methods

cache(holidays, date_min, date_max) click to toggle source
# File lib/holidays_from_google_calendar/cache.rb, line 16
def cache(holidays, date_min, date_max)
  pack_container(CacheUnit.new(holidays.dup, date_min, date_max))
  page_out if calculate_size > @max_size
end
enabled?() click to toggle source
# File lib/holidays_from_google_calendar/cache.rb, line 12
def enabled?
  @enable
end
retrieve(date_min, date_max) click to toggle source
# File lib/holidays_from_google_calendar/cache.rb, line 21
def retrieve(date_min, date_max)
  unit = @container.find { |e| e.include?(date_min, date_max) }
  return nil if unit.nil?

  # For LRU (Least Recently Used)
  @container.delete(unit)
  @container.push(unit)

  unit.retrieve(date_min, date_max)
end

Private Instance Methods

calculate_size() click to toggle source

The size of cache is sum of unit count and the number of holidays

# File lib/holidays_from_google_calendar/cache.rb, line 35
def calculate_size
  @size = unit_count + holidays_count
end
holidays_count() click to toggle source
# File lib/holidays_from_google_calendar/cache.rb, line 43
def holidays_count
  @container.map(&:size).sum
end
pack_container(new_unit) click to toggle source
# File lib/holidays_from_google_calendar/cache.rb, line 47
def pack_container(new_unit)
  unnecessary_units = @container.reduce([]) do |array, unit|
    # If there are overlapped units, combine them into the new unit
    if new_unit.include?(unit.date_min, unit.date_max)
      array.push(unit)
    elsif new_unit.overlapped?(unit)
      new_unit.combine(unit)
      array.push(unit)
    else
      array # Do nothing
    end
  end
  @container -= unnecessary_units
  @container.push(new_unit)
end
page_out() click to toggle source
# File lib/holidays_from_google_calendar/cache.rb, line 63
def page_out
  deleted_size = 0
  while (@size - deleted_size) > @max_size
    unit = @container.shift
    deleted_size += (1 + unit.size) # Size is unit count plus holiday count
  end
  @size -= deleted_size
end
unit_count() click to toggle source
# File lib/holidays_from_google_calendar/cache.rb, line 39
def unit_count
  @container.size
end