Bounded LRU cache backed by a Hash

Crystal
class LRUCache(K, V)
  def initialize(@capacity : Int32)
    raise ArgumentError.new("capacity must be >= 1") if @capacity < 1
    @data = {} of K => V
  end

  def get(key : K) : V?
    return nil unless @data.has_key?(key)
    value = @data[key]
    @data.delete(key)
    @data[key] = value
    value
  end

  def put(key : K, value : V) : Nil
    @data.delete(key)
    @data.shift if @data.size >= @capacity
    @data[key] = value
  end
end