def assert_equal(x, y) return if x == y raise "Expected `#{x.inspect}`, got `#{y.inspect}`" end class Store def initialize @hash = Hash.new do |hash, key| hash[key] = [] end end # time: O(1) + O(logn) # space: O(1) def get(key, at: nil) bucket = @hash[key] return if bucket[-1].empty? if at bucket[-1].bsearch { |x| x <= at }[-1] else bucket[-1][-1] end end # time: O(1) # space: O(1) def set(key, value) @hash[key] << [Time.now.to_i, value] end end store = Store.new store.set(:cart, 0) now = Time.now.to_i assert_equal(0, store.get(:cart)) store.set(:cart, 3) assert_equal(3, store.get(:cart)) assert_equal(0, store.get(:cart, at: now)) puts "YAY!"