Module: Glimmer::DataBinding::ObservableArray
- Includes:
- Observable
- Defined in:
- lib/glimmer/data_binding/observable_array.rb
Instance Method Summary collapse
- #<<(element) ⇒ Object (also: #push)
- #[]=(index, value) ⇒ Object
- #add_element_observer(element, observer) ⇒ Object
- #add_element_observers(element) ⇒ Object
- #add_observer(observer, *element_properties) ⇒ Object
- #clear ⇒ Object
- #collect!(&block) ⇒ Object (also: #map!)
- #compact! ⇒ Object
- #delete(element) ⇒ Object
- #delete_at(index) ⇒ Object
- #delete_if(&block) ⇒ Object
- #element_properties_for(observer) ⇒ Object
- #flatten!(level = nil) ⇒ Object
- #has_observer?(observer) ⇒ Boolean
- #has_observer_element_properties?(observer, element_properties) ⇒ Boolean
- #notify_observers ⇒ Object
- #observer_element_properties ⇒ Object
- #pop ⇒ Object
- #property_observer_list ⇒ Object
- #reject!(&block) ⇒ Object
- #remove_element_observer(element, observer) ⇒ Object
- #remove_element_observers(element) ⇒ Object
- #remove_observer(observer, *element_properties) ⇒ Object
- #reverse! ⇒ Object
- #rotate!(count = 1) ⇒ Object
- #select!(&block) ⇒ Object
- #shuffle!(hash = nil) ⇒ Object
- #slice!(arg1, arg2 = nil) ⇒ Object
- #sort!(&block) ⇒ Object
- #sort_by!(&block) ⇒ Object
- #uniq!(&block) ⇒ Object
- #unregister_dependent_observers(old_value) ⇒ Object
Methods included from Observable
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 |
#clear ⇒ Object
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
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
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_observers ⇒ Object
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_properties ⇒ Object
93 94 95 |
# File 'lib/glimmer/data_binding/observable_array.rb', line 93 def observer_element_properties @observer_element_properties ||= {} end |
#pop ⇒ Object
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_list ⇒ Object
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 |