Class: Salus::ObserversSet

Inherits:
Object
  • Object
show all
Includes:
Lockable
Defined in:
lib/salus/thread/observable.rb

Overview

Loosely based on code from github.com/ruby-concurrency/concurrent-ruby/

Instance Method Summary collapse

Methods included from Lockable

#broadcast, #signal, #synchronize, #wait, #wait_until

Constructor Details

#initializeObserversSet

Returns a new instance of ObserversSet.



6
7
8
# File 'lib/salus/thread/observable.rb', line 6

def initialize
  synchronize { @observers = {} }
end

Instance Method Details

#add(observer = nil, func = :update, &block) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/salus/thread/observable.rb', line 10

def add(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

  synchronize do
    new_observers = @observers.dup
    new_observers[observer] = func
    @observers = new_observers
    observer
  end
end

#countObject



60
61
62
# File 'lib/salus/thread/observable.rb', line 60

def count
  synchronize { @observers.count }
end

#delete(observer) ⇒ Object



30
31
32
33
34
35
36
37
# File 'lib/salus/thread/observable.rb', line 30

def delete(observer)
  synchronize do
    new_observers = @observers.dup
    new_observers.delete(observer)
    @observers = new_observers
    observer
  end
end

#delete_allObject



39
40
41
42
# File 'lib/salus/thread/observable.rb', line 39

def delete_all
  synchronize { @observers = {} }
  self
end

#notify(*args, &block) ⇒ Object



44
45
46
47
48
# File 'lib/salus/thread/observable.rb', line 44

def notify(*args, &block)
  obs = synchronize { @observers }
  notify_to(obs, *args, &block)
  self
end

#notify_and_delete(*args, &block) ⇒ Object



50
51
52
53
54
55
56
57
58
# File 'lib/salus/thread/observable.rb', line 50

def notify_and_delete(*args, &block)
  old = synchronize do
    old =  @observers
    @observers = {}
    old
  end
  notify_to(old, *args, &block)
  self
end