module Glimmer::DataBinding::ObservableHash
Public Instance Methods
Source
# File lib/glimmer/data_binding/observable_hash.rb, line 43 def add_observer(observer, key = nil, options = {}) if key.is_a?(Hash) options = key key = nil end return observer if has_observer?(observer, key) key_observer_list(key) << observer add_key_writer_observer(key, options) observer end
Source
# File lib/glimmer/data_binding/observable_hash.rb, line 95 def all_key_observer_list key_observer_list(nil) end
Source
# File lib/glimmer/data_binding/observable_hash.rb, line 123 def array_object_observer_for(key) @array_object_observers ||= Concurrent::Hash.new @array_object_observers[key] = ObservableModel::Notifier.new(self, key) unless @array_object_observers.has_key?(key) @array_object_observers[key] end
Source
# File lib/glimmer/data_binding/observable_hash.rb, line 129 def delete(key, &block) old_value = self[key] unless old_value.nil? unregister_dependent_observers(key, old_value) unregister_dependent_observers(nil, old_value) end super(key, &block).tap do notify_observers(key) unless old_value.nil? end end
Calls superclass method
Source
# File lib/glimmer/data_binding/observable_hash.rb, line 140 def delete_if(&block) if block_given? old_hash = self.dup super(&block).tap do |new_hash| deleted_keys = old_hash.keys - new_hash.keys deleted_keys.each do |deleted_key| deleted_value = old_hash[deleted_key] unless deleted_value.nil? unregister_dependent_observers(deleted_key, deleted_value) unregister_dependent_observers(nil, deleted_value) notify_observers(deleted_key) end end end else super end end
Calls superclass method
Source
# File lib/glimmer/data_binding/observable_hash.rb, line 111 def ensure_array_object_observer(key, object, old_object = nil, options = {}) options ||= {} return unless object&.is_a?(Array) array_object_observer = array_object_observer_for(key) array_observer_registration = array_object_observer.observe(object, options) key_observer_list(key).each do |observer| my_registration = observer.registration_for(self, key) # TODO eliminate repetition observer.add_dependent(my_registration => array_observer_registration) end array_object_observer_for(key).unregister(old_object) if old_object.is_a?(ObservableArray) end
Source
# File lib/glimmer/data_binding/observable_hash.rb, line 178 def filter!(&block) if block_given? old_hash = self.dup super(&block).tap do |new_hash| deleted_keys = old_hash.keys - new_hash.keys deleted_keys.each do |deleted_key| deleted_value = old_hash[deleted_key] unless deleted_value.nil? unregister_dependent_observers(deleted_key, deleted_value) unregister_dependent_observers(nil, deleted_value) notify_observers(deleted_key) end end end else super end end
Calls superclass method
Source
# File lib/glimmer/data_binding/observable_hash.rb, line 78 def has_observer?(observer, key = nil) key_observer_list(key).include?(observer) end
Source
# File lib/glimmer/data_binding/observable_hash.rb, line 82 def has_observer_for_any_key?(observer) key_observer_hash.values.map(&:to_a).reduce(:+).include?(observer) end
Source
# File lib/glimmer/data_binding/observable_hash.rb, line 197 def keep_if(&block) if block_given? old_hash = self.dup super(&block).tap do |new_hash| deleted_keys = old_hash.keys - new_hash.keys deleted_keys.each do |deleted_key| deleted_value = old_hash[deleted_key] unless deleted_value.nil? unregister_dependent_observers(deleted_key, deleted_value) unregister_dependent_observers(nil, deleted_value) notify_observers(deleted_key) end end end else super end end
Calls superclass method
Source
# File lib/glimmer/data_binding/observable_hash.rb, line 86 def key_observer_hash @key_observers ||= Concurrent::Hash.new end
Source
# File lib/glimmer/data_binding/observable_hash.rb, line 90 def key_observer_list(key) key_observer_hash[key] = Concurrent::Set.new unless key_observer_hash[key] key_observer_hash[key] end
Source
# File lib/glimmer/data_binding/observable_hash.rb, line 251 def merge!(*other_hashes, &block) if other_hashes.empty? super else old_hash = self.dup super(*other_hashes, &block).tap do |new_hash| changed_keys = other_hashes.map(&:keys).reduce(:+) changed_keys.each do |changed_key| old_value = old_hash[changed_key] if new_hash[changed_key] != old_value unregister_dependent_observers(changed_key, old_value) unregister_dependent_observers(nil, old_value) notify_observers(changed_key) end end end end end
Calls superclass method
Source
# File lib/glimmer/data_binding/observable_hash.rb, line 99 def notify_observers(key) all_key_observer_list.to_a.each { |observer| observer.call(self[key], key) } (key_observer_list(key).to_a - all_key_observer_list.to_a).each { |observer| observer.call(self[key], key) } end
Source
# File lib/glimmer/data_binding/observable_hash.rb, line 216 def reject!(&block) if block_given? old_hash = self.dup super(&block).tap do |new_hash| deleted_keys = old_hash.keys - new_hash.keys deleted_keys.each do |deleted_key| deleted_value = old_hash[deleted_key] unless deleted_value.nil? unregister_dependent_observers(deleted_key, deleted_value) unregister_dependent_observers(nil, deleted_value) notify_observers(deleted_key) end end end else super end end
Calls superclass method
Source
# File lib/glimmer/data_binding/observable_hash.rb, line 69 def remove_all_observers all_observers = key_observer_hash.clone key_observer_hash.keys.each do |key| remove_observers(key) end key_observer_hash.clear all_observers end
Source
# File lib/glimmer/data_binding/observable_hash.rb, line 54 def remove_observer(observer, key = nil, options = {}) old_value = self[key] if has_observer?(observer, key) key_observer_list(key).delete(observer) observer.unobserve(self, key) end end
Source
# File lib/glimmer/data_binding/observable_hash.rb, line 62 def remove_observers(key) key_observer_hash[key].each do |observer| remove_observer(observer, key) end key_observer_hash.delete(key) end
Source
# File lib/glimmer/data_binding/observable_hash.rb, line 270 def replace(other_hash) old_hash = self.dup super(other_hash).tap do |new_hash| changed_keys = old_hash.keys + new_hash.keys changed_keys.each do |changed_key| old_value = old_hash[changed_key] if new_hash[changed_key] != old_value unregister_dependent_observers(changed_key, old_value) unregister_dependent_observers(nil, old_value) notify_observers(changed_key) end end end end
Calls superclass method
Source
# File lib/glimmer/data_binding/observable_hash.rb, line 159 def select!(&block) if block_given? old_hash = self.dup super(&block).tap do |new_hash| deleted_keys = old_hash.keys - new_hash.keys deleted_keys.each do |deleted_key| deleted_value = old_hash[deleted_key] unless deleted_value.nil? unregister_dependent_observers(deleted_key, deleted_value) unregister_dependent_observers(nil, deleted_value) notify_observers(deleted_key) end end end else super end end
Calls superclass method
Source
# File lib/glimmer/data_binding/observable_hash.rb, line 235 def shift old_hash = self.dup super.tap do new_hash = self deleted_keys = old_hash.keys - new_hash.keys deleted_keys.each do |deleted_key| deleted_value = old_hash[deleted_key] unless deleted_value.nil? unregister_dependent_observers(deleted_key, deleted_value) unregister_dependent_observers(nil, deleted_value) notify_observers(deleted_key) end end end end
Calls superclass method
Source
# File lib/glimmer/data_binding/observable_hash.rb, line 285 def transform_keys!(hash2 = nil, &block) if hash2.nil? && block.nil? super else old_hash = self.dup result = hash2.nil? ? super(&block) : super(hash2, &block) result.tap do |new_hash| changed_keys = old_hash.keys + new_hash.keys changed_keys.each do |changed_key| old_value = old_hash[changed_key] if new_hash[changed_key] != old_value unregister_dependent_observers(changed_key, old_value) unregister_dependent_observers(nil, old_value) notify_observers(changed_key) end end end end end
Calls superclass method
Source
# File lib/glimmer/data_binding/observable_hash.rb, line 305 def transform_values!(&block) if block_given? old_hash = self.dup super(&block).tap do |new_hash| new_hash.keys.each do |changed_key| old_value = old_hash[changed_key] if new_hash[changed_key] != old_value unregister_dependent_observers(changed_key, old_value) unregister_dependent_observers(nil, old_value) notify_observers(changed_key) end end end else super end end
Calls superclass method
Source
# File lib/glimmer/data_binding/observable_hash.rb, line 104 def unregister_dependent_observers(key, old_value) # TODO look into optimizing this return unless old_value.is_a?(ObservableModel) || old_value.is_a?(ObservableArray) || old_value.is_a?(ObservableHash) key_observer_list(key).each { |observer| observer.unregister_dependents_with_observable(observer.registration_for(self, key), old_value) } end
Also aliased as: deregister_dependent_observers