Class: Garcon::CopyOnWriteObserverSet
- Defined in:
- lib/hoodie/observable.rb
Overview
A thread safe observer set implemented using copy-on-write approach. Every time an observer is added or removed the whole internal data structure is duplicated and replaced with a new one.
Instance Method Summary collapse
-
#add_observer(observer = nil, func = :update, &block) ⇒ Object
Adds an observer to this set, if a block is passed, the observer will be created by this method and no other params should be passed.
-
#count_observers ⇒ Integer
The observers count.
-
#delete_observer(observer) ⇒ Object
The deleted observer.
-
#delete_observers ⇒ CopyOnWriteObserverSet
Deletes all observers.
-
#initialize ⇒ CopyOnWriteObserverSet
constructor
A new instance of CopyOnWriteObserverSet.
-
#notify_and_delete_observers(*args, &block) ⇒ CopyOnWriteObserverSet
Notifies all registered observers with optional args and deletes them.
-
#notify_observers(*args, &block) ⇒ CopyOnWriteObserverSet
Notifies all registered observers with optional args.
Constructor Details
#initialize ⇒ CopyOnWriteObserverSet
Returns a new instance of CopyOnWriteObserverSet.
180 181 182 183 |
# File 'lib/hoodie/observable.rb', line 180 def initialize @mutex = Mutex.new @observers = {} end |
Instance Method Details
#add_observer(observer = nil, func = :update, &block) ⇒ Object
Adds an observer to this set, if a block is passed, the observer will be created by this method and no other params should be passed.
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 |
# File 'lib/hoodie/observable.rb', line 196 def add_observer(observer = nil, func = :update, &block) if observer.nil? && block.nil? raise ArgumentError, 'should pass observer as a first argument or block' elsif observer && block raise ArgumentError, 'cannot provide both an observer and a block' end if block observer = block func = :call end begin @mutex.lock new_observers = @observers.dup new_observers[observer] = func @observers = new_observers observer ensure @mutex.unlock end end |
#count_observers ⇒ Integer
Returns the observers count.
245 246 247 |
# File 'lib/hoodie/observable.rb', line 245 def count_observers observers.count end |
#delete_observer(observer) ⇒ Object
Returns the deleted observer.
223 224 225 226 227 228 229 230 231 |
# File 'lib/hoodie/observable.rb', line 223 def delete_observer(observer) @mutex.lock new_observers = @observers.dup new_observers.delete(observer) @observers = new_observers observer ensure @mutex.unlock end |
#delete_observers ⇒ CopyOnWriteObserverSet
Deletes all observers
237 238 239 240 |
# File 'lib/hoodie/observable.rb', line 237 def delete_observers self.observers = {} self end |
#notify_and_delete_observers(*args, &block) ⇒ CopyOnWriteObserverSet
Notifies all registered observers with optional args and deletes them.
268 269 270 271 272 |
# File 'lib/hoodie/observable.rb', line 268 def notify_and_delete_observers(*args, &block) old = clear_observers_and_return_old notify_to(old, *args, &block) self end |
#notify_observers(*args, &block) ⇒ CopyOnWriteObserverSet
Notifies all registered observers with optional args.
256 257 258 259 |
# File 'lib/hoodie/observable.rb', line 256 def notify_observers(*args, &block) notify_to(observers, *args, &block) self end |