Module: Glimmer::DataBinding::ObservableArray

Includes:
Observable
Defined in:
lib/glimmer/data_binding/observable_array.rb

Instance Method Summary collapse

Methods included from Observable

#inspect

Instance Method Details

#<<(element) ⇒ Object Also known as: push



105
106
107
108
109
110
# File 'lib/glimmer/data_binding/observable_array.rb', line 105

def <<(element)
  super(element).tap do
    add_element_observers(element)        
    notify_observers
  end
end

#[]=(index, value) ⇒ Object



113
114
115
116
117
118
119
120
121
# File 'lib/glimmer/data_binding/observable_array.rb', line 113

def []=(index, value)
  old_value = self[index]
  unregister_dependent_observers(old_value)
  remove_element_observers(old_value)
  add_element_observers(value)    
  super(index, value).tap do
    notify_observers
  end
end

#add_element_observer(element, observer) ⇒ Object



48
49
50
51
52
# File 'lib/glimmer/data_binding/observable_array.rb', line 48

def add_element_observer(element, observer)
  element_properties_for(observer).each do |property|
    observer.observe(element, property)
  end      
end

#add_element_observers(element) ⇒ Object



42
43
44
45
46
# File 'lib/glimmer/data_binding/observable_array.rb', line 42

def add_element_observers(element)
  property_observer_list.each do |observer|
    add_element_observer(element, observer)
  end
end

#add_observer(observer, *element_properties) ⇒ Object



33
34
35
36
37
38
39
40
# File 'lib/glimmer/data_binding/observable_array.rb', line 33

def add_observer(observer, *element_properties)
  element_properties = element_properties.flatten.compact.uniq
  return observer if has_observer?(observer) && has_observer_element_properties?(observer, element_properties)
  property_observer_list << observer
  observer_element_properties[observer] = element_properties_for(observer) + Set.new(element_properties)
  each { |element| add_element_observer(element, observer) }
  observer
end

#clearObject



164
165
166
167
168
169
170
171
172
# File 'lib/glimmer/data_binding/observable_array.rb', line 164

def clear
  each do |old_value|
    unregister_dependent_observers(old_value)
    remove_element_observers(old_value)
  end
  super.tap do
    notify_observers
  end
end

#collect!(&block) ⇒ Object Also known as: map!



180
181
182
183
184
185
186
187
188
189
190
191
192
193
# File 'lib/glimmer/data_binding/observable_array.rb', line 180

def collect!(&block)
  if block_given?
    each do |old_value|
      unregister_dependent_observers(old_value)
      remove_element_observers(old_value)
    end
    super(&block).tap do
      each { |element| add_element_observers(element) }
      notify_observers
    end
  else
    super
  end
end

#compact!Object



196
197
198
# File 'lib/glimmer/data_binding/observable_array.rb', line 196

def compact!
  super.tap { notify_observers }
end

#delete(element) ⇒ Object



132
133
134
135
136
137
138
# File 'lib/glimmer/data_binding/observable_array.rb', line 132

def delete(element)
  unregister_dependent_observers(element)
  remove_element_observers(element)
  super(element).tap do
    notify_observers
  end
end

#delete_at(index) ⇒ Object



140
141
142
143
144
145
146
147
# File 'lib/glimmer/data_binding/observable_array.rb', line 140

def delete_at(index)
  old_value = self[index]
  unregister_dependent_observers(old_value)
  remove_element_observers(old_value)
  super(index).tap do
    notify_observers
  end
end

#delete_if(&block) ⇒ Object



149
150
151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/glimmer/data_binding/observable_array.rb', line 149

def delete_if(&block)
  if block_given?
    old_array = Array.new(self)
    super(&block).tap do |new_array|
      (old_array - new_array).each do |element| 
        unregister_dependent_observers(element)
        remove_element_observers(element)
      end
      notify_observers
    end
  else
    super
  end
end

#element_properties_for(observer) ⇒ Object



97
98
99
# File 'lib/glimmer/data_binding/observable_array.rb', line 97

def element_properties_for(observer)
  observer_element_properties[observer] ||= Set.new
end

#flatten!(level = nil) ⇒ Object



200
201
202
203
204
205
206
207
208
209
# File 'lib/glimmer/data_binding/observable_array.rb', line 200

def flatten!(level=nil)
  each do |old_value|
    unregister_dependent_observers(old_value)
    remove_element_observers(old_value)
  end
  (level.nil? ? super() : super(level)).tap do
    each { |element| add_element_observers(element) }
    notify_observers
  end
end

#has_observer?(observer) ⇒ Boolean

Returns:

  • (Boolean)


81
82
83
# File 'lib/glimmer/data_binding/observable_array.rb', line 81

def has_observer?(observer)
  property_observer_list.include?(observer)
end

#has_observer_element_properties?(observer, element_properties) ⇒ Boolean

Returns:

  • (Boolean)


85
86
87
# File 'lib/glimmer/data_binding/observable_array.rb', line 85

def has_observer_element_properties?(observer, element_properties)
  element_properties_for(observer).to_a.include_all?(element_properties)
end

#notify_observersObject



101
102
103
# File 'lib/glimmer/data_binding/observable_array.rb', line 101

def notify_observers
  property_observer_list.to_a.each(&:call)
end

#observer_element_propertiesObject



93
94
95
# File 'lib/glimmer/data_binding/observable_array.rb', line 93

def observer_element_properties
  @observer_element_properties ||= {}
end

#popObject



123
124
125
126
127
128
129
130
# File 'lib/glimmer/data_binding/observable_array.rb', line 123

def pop
  popped_element = last
  unregister_dependent_observers(popped_element)
  remove_element_observers(popped_element)
  super.tap do
    notify_observers
  end
end

#property_observer_listObject



89
90
91
# File 'lib/glimmer/data_binding/observable_array.rb', line 89

def property_observer_list
  @property_observer_list ||= Set.new
end

#reject!(&block) ⇒ Object



264
265
266
267
268
269
270
271
272
273
274
275
276
277
# File 'lib/glimmer/data_binding/observable_array.rb', line 264

def reject!(&block)
  if block.nil?
    super
  else
    old_array = Array.new(self)
    super(&block).tap do
      (old_array - self).each do |old_value|
        unregister_dependent_observers(old_value)
        remove_element_observers(old_value)
      end
      notify_observers
    end
  end
end

#remove_element_observer(element, observer) ⇒ Object



75
76
77
78
79
# File 'lib/glimmer/data_binding/observable_array.rb', line 75

def remove_element_observer(element, observer)
  element_properties_for(observer).each do |property|
    observer.unobserve(element, property)
  end      
end

#remove_element_observers(element) ⇒ Object



69
70
71
72
73
# File 'lib/glimmer/data_binding/observable_array.rb', line 69

def remove_element_observers(element)
  property_observer_list.each do |observer|
    remove_element_observer(element, observer)
  end      
end

#remove_observer(observer, *element_properties) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/glimmer/data_binding/observable_array.rb', line 54

def remove_observer(observer, *element_properties)
  element_properties = element_properties.flatten.compact.uniq
  if !element_properties.empty?
    old_element_properties = element_properties_for(observer)
    observer_element_properties[observer] = element_properties_for(observer) - Set.new(element_properties)
    each { |element| element_properties.each { |property| observer.unobserve(element, property) } }
  end
  if element_properties_for(observer).empty?
    property_observer_list.delete(observer)
    observer_element_properties.delete(observer)
    each { |element| remove_element_observer(element, observer) }
  end        
  observer
end

#reverse!Object



174
175
176
177
178
# File 'lib/glimmer/data_binding/observable_array.rb', line 174

def reverse!
  super.tap do
    notify_observers
  end
end

#rotate!(count = 1) ⇒ Object



211
212
213
# File 'lib/glimmer/data_binding/observable_array.rb', line 211

def rotate!(count=1)
  super(count).tap { notify_observers }
end

#select!(&block) ⇒ Object



215
216
217
218
219
220
221
222
223
224
225
226
227
228
# File 'lib/glimmer/data_binding/observable_array.rb', line 215

def select!(&block)
  if block_given?
    old_array = Array.new(self)
    super(&block).tap do
      (old_array - self).each do |old_value|
        unregister_dependent_observers(old_value)
        remove_element_observers(old_value)
      end
      notify_observers
    end
  else
    super
  end
end

#shuffle!(hash = nil) ⇒ Object



230
231
232
# File 'lib/glimmer/data_binding/observable_array.rb', line 230

def shuffle!(hash = nil)
  (hash.nil? ? super() : super(random: hash[:random])).tap { notify_observers }
end

#slice!(arg1, arg2 = nil) ⇒ Object



234
235
236
237
238
239
240
241
242
243
# File 'lib/glimmer/data_binding/observable_array.rb', line 234

def slice!(arg1, arg2=nil)
  old_array = Array.new(self)
  (arg2.nil? ? super(arg1) : super(arg1, arg2)).tap do
    (old_array - self).each do |old_value|
      unregister_dependent_observers(old_value)
      remove_element_observers(old_value)
    end
    notify_observers
  end
end

#sort!(&block) ⇒ Object



245
246
247
# File 'lib/glimmer/data_binding/observable_array.rb', line 245

def sort!(&block)
  (block.nil? ? super() : super(&block)).tap { notify_observers }
end

#sort_by!(&block) ⇒ Object



249
250
251
# File 'lib/glimmer/data_binding/observable_array.rb', line 249

def sort_by!(&block)
  (block.nil? ? super() : super(&block)).tap { notify_observers }
end

#uniq!(&block) ⇒ Object



253
254
255
256
257
258
259
260
261
262
# File 'lib/glimmer/data_binding/observable_array.rb', line 253

def uniq!(&block)
  each do |old_value|
    unregister_dependent_observers(old_value)
    remove_element_observers(old_value)
  end
  (block.nil? ? super() : super(&block)).tap do
    each { |element| add_element_observers(element) }
    notify_observers
  end
end

#unregister_dependent_observers(old_value) ⇒ Object



279
280
281
282
# File 'lib/glimmer/data_binding/observable_array.rb', line 279

def unregister_dependent_observers(old_value)
  return unless old_value.is_a?(ObservableModel) || old_value.is_a?(ObservableArray)
  property_observer_list.each { |observer| observer.unregister_dependents_with_observable(observer.registration_for(self), old_value) }
end