Method: Immutable::Vector#set

Defined in:
lib/immutable/vector.rb

#set(index, item) ⇒ Vector #set(index) {|existing| ... } ⇒ Vector

Return a new Vector with a new value at the given index. If index is greater than the length of the vector, the returned vector will be padded with ‘nil`s to the correct size.

Overloads:

  • #set(index, item) ⇒ Vector

    Return a new Vector with the item at index replaced by item.

    Examples:

    Immutable::Vector[1, 2, 3, 4].set(2, 99)
    # => Immutable::Vector[1, 2, 99, 4]
    Immutable::Vector[1, 2, 3, 4].set(-1, 99)
    # => Immutable::Vector[1, 2, 3, 99]
    Immutable::Vector[].set(2, 99)
    # => Immutable::Vector[nil, nil, 99]

    Parameters:

    • item (Object)

      The object to insert into that position

  • #set(index) {|existing| ... } ⇒ Vector

    Return a new Vector with the item at index replaced by the return value of the block.

    Examples:

    Immutable::Vector[1, 2, 3, 4].set(2) { |v| v * 10 }
    # => Immutable::Vector[1, 2, 30, 4]

    Yields:

    • (existing)

      Once with the existing value at the given index.

Parameters:

  • index (Integer)

    The index to update. May be negative.

Returns:

Raises:

  • (IndexError)


165
166
167
168
169
170
171
172
173
174
175
# File 'lib/immutable/vector.rb', line 165

def set(index, item = yield(get(index)))
  raise IndexError, "index #{index} outside of vector bounds" if index < -@size
  index += @size if index < 0
  if index > @size
    suffix = Array.new(index - @size, nil)
    suffix << item
    replace_suffix(@size, suffix)
  else
    update_root(index, item)
  end
end