ledestin/frugal_timeout

View on GitHub
lib/frugal_timeout/storage.rb

Summary

Maintainability
A
0 mins
Test Coverage
# Copyright (C) 2013, 2014 by Dmitry Maksyoma <ledestin@gmail.com>

module FrugalTimeout
  # Stores values for keys, such as:
  # 1. `set key, val' will store val.
  # 2. `set key, val2' will store [val, val2].
  # 3. `delete key, val2' will lead to storing just val again.
  # I.e. array is used only when it's absolutely necessary.
  #
  # While it's harder to write code because of this, we do save memory by not
  # instantiating all those arrays.
  class Storage #:nodoc:
    def initialize
      @storage = {}
    end

    def delete key, val=nil
      return unless stored = @storage[key]

      if val.nil? || stored == val
    @storage.delete key
    return
      end

      stored.delete val
      @storage[key] = stored.first if stored.size == 1
    end

    def get key
      @storage[key]
    end
    alias :[] :get

    def set key, val
      unless stored = @storage[key]
    @storage[key] = val
    return
      end

      if stored.is_a? Array
    stored << val
      else
    @storage[key] = [stored, val]
      end
    end
  end
end