class Foobara::LruCache

def cached(key)

def cached(key)
  mutex.synchronize do
    if @key_to_node.key?(key)
      node = @key_to_node[key]
      move_node_to_front(node)
      return node.value
    end
  end
  value = yield
  mutex.synchronize do
    if @key_to_node.key?(key)
      node = @key_to_node[key]
      move_node_to_front(node)
    else
      node = Node.new(key, value)
      @key_to_node[key] = node
      prepend_node(node)
    end
  end
  value
end