Class: Ruwi::Utils::Arrays::ArrayWithOriginalIndices

Inherits:
Object
  • Object
show all
Defined in:
lib/ruwi/runtime/utils/arrays.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(array, equal_proc) ⇒ ArrayWithOriginalIndices

Returns a new instance of ArrayWithOriginalIndices.



34
35
36
37
38
# File 'lib/ruwi/runtime/utils/arrays.rb', line 34

def initialize(array, equal_proc)
  @array = array.dup
  @original_indices = array.each_index.to_a
  @equal_proc = equal_proc
end

Instance Attribute Details

#arrayObject (readonly)

Returns the value of attribute array.



23
24
25
# File 'lib/ruwi/runtime/utils/arrays.rb', line 23

def array
  @array
end

#equal_procObject (readonly)

Returns the value of attribute equal_proc.



23
24
25
# File 'lib/ruwi/runtime/utils/arrays.rb', line 23

def equal_proc
  @equal_proc
end

#original_indicesObject (readonly)

Returns the value of attribute original_indices.



23
24
25
# File 'lib/ruwi/runtime/utils/arrays.rb', line 23

def original_indices
  @original_indices
end

Instance Method Details

#add_item(item, index) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/ruwi/runtime/utils/arrays.rb', line 84

def add_item(item, index)
  operation = {
    op: ARRAY_DIFF_OP[:ADD],
    index:,
    item:
  }

  @array.insert(index, item)
  @original_indices.insert(index, -1)

  operation
end

#is_addition?(item, from_index) ⇒ Boolean

Returns:

  • (Boolean)


58
59
60
# File 'lib/ruwi/runtime/utils/arrays.rb', line 58

def is_addition?(item, from_index)
  return find_index_from(item, from_index).nil?
end

#is_noop?(index, new_array) ⇒ Boolean

Returns:

  • (Boolean)


49
50
51
52
53
54
55
56
# File 'lib/ruwi/runtime/utils/arrays.rb', line 49

def is_noop?(index, new_array)
  return false if index >= length

  item = @array[index]
  new_item = new_array[index]

  @equal_proc.call(item, new_item)
end

#is_removal?(index, new_array) ⇒ Boolean

Returns:

  • (Boolean)


40
41
42
43
44
45
46
47
# File 'lib/ruwi/runtime/utils/arrays.rb', line 40

def is_removal?(index, new_array)
  return false if index >= length

  item = @array[index]
  index_in_new_array = new_array.find_index { |new_item| @equal_proc.call(new_item, item) }

  index_in_new_array.nil?
end

#move_item(item, to_index) ⇒ Object



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/ruwi/runtime/utils/arrays.rb', line 97

def move_item(item, to_index)
  from_index = find_index_from(item, to_index)

  operation = {
    op: ARRAY_DIFF_OP[:MOVE],
    original_index: original_index_at(from_index),
    from: from_index,
    index: to_index,
    item: @array[from_index]
  }

  temp_deleted_item = @array.delete_at(from_index)
  @array.insert(to_index, temp_deleted_item)

  temp_deleted_original_index = @original_indices.delete_at(from_index)
  @original_indices.insert(to_index, temp_deleted_original_index)

  operation
end

#noop_item(index) ⇒ Object



75
76
77
78
79
80
81
82
# File 'lib/ruwi/runtime/utils/arrays.rb', line 75

def noop_item(index)
  {
    op: ARRAY_DIFF_OP[:NOOP],
    original_index: original_index_at(index),
    index:,
    item: @array[index]
  }
end

#remove_item(index) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/ruwi/runtime/utils/arrays.rb', line 62

def remove_item(index)
  operation = {
    op: ARRAY_DIFF_OP[:REMOVE],
    index:,
    item: @array[index]
  }

  @array.delete_at(index)
  @original_indices.delete_at(index)

  operation
end

#remove_item_after(index) ⇒ Object



117
118
119
120
121
122
123
124
125
# File 'lib/ruwi/runtime/utils/arrays.rb', line 117

def remove_item_after(index)
  operations = []

  while index < length
    operations << remove_item(index)
  end

  operations
end