Class: ReactiveCount

Inherits:
Object show all
Includes:
ReactiveTags
Defined in:
lib/volt/reactive/reactive_count.rb

Instance Method Summary collapse

Methods included from ReactiveTags

included, #reactive_method_tag

Constructor Details

#initialize(source, block) ⇒ ReactiveCount

Returns a new instance of ReactiveCount.



8
9
10
11
# File 'lib/volt/reactive/reactive_count.rb', line 8

def initialize(source, block)
  @source = ReactiveValue.new(source)
  @block = block
end

Instance Method Details

#cached_countObject

After events are bound, we keep a cache of each cell’s count value, and base the results



19
20
21
22
23
# File 'lib/volt/reactive/reactive_count.rb', line 19

def cached_count
  @cached_results = []


end

#change_cell_count(size) ⇒ Object

We need to make sure we’re listening on the result from each cell, that way we can trigger when the value changes.



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/volt/reactive/reactive_count.rb', line 59

def change_cell_count(size)
  # puts "CHANGE SIZE: #{size}"
  current_size = @cell_trackers.size

  if current_size < size
    # Add trackers

    current_size.upto(size-1) do |index|
      # Get the reactive value for the index
      val = @source[index]

      result = @block.call(val)

      @cell_trackers << result.on('changed') do
        # puts "RESULT CHANGED: #{index}"
        trigger!('changed')
      end
    end
  elsif current_size > size
    (current_size-1).downto(size) do |index|
      @cell_trackers[index].remove
      @cell_trackers.delete_at(index)
    end
  end
end

#curObject



13
14
15
# File 'lib/volt/reactive/reactive_count.rb', line 13

def cur
  direct_count
end

#direct_countObject

Before events are bound, when .cur is called, we simply run the count on the source object.



27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/volt/reactive/reactive_count.rb', line 27

def direct_count
  count = 0
  @source.cur.size.times do |index|
    val = @source[index]
    result = @block.call(val).cur
    if result == true
      count += 1
    end
  end

  count
end

#event_added(event, scope_provider, first, first_for_event) ⇒ Object



98
99
100
# File 'lib/volt/reactive/reactive_count.rb', line 98

def event_added(event, scope_provider, first, first_for_event)
  setup_listeners if first
end

#event_removed(event, last, last_for_event) ⇒ Object



102
103
104
# File 'lib/volt/reactive/reactive_count.rb', line 102

def event_removed(event, last, last_for_event)
  teardown_listeners if last
end

#inspectObject



106
107
108
# File 'lib/volt/reactive/reactive_count.rb', line 106

def inspect
  "@#{cur}"
end

#reactive?Boolean

Returns:



4
5
6
# File 'lib/volt/reactive/reactive_count.rb', line 4

def reactive?
  true
end

#setup_listenersObject



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/volt/reactive/reactive_count.rb', line 40

def setup_listeners
  @cell_trackers = []
  @setup = false
  @added_tracker = @source.on('added') do |_, index|
    change_cell_count(@source.size.cur)
  end

  @removed_tracker = @source.on('removed') do |_, index|
    change_cell_count(@source.size.cur)
  end

  @setup = true

  # Initial cell tracking
  change_cell_count(@source.size.cur)
end

#teardown_listenersObject



86
87
88
89
90
91
92
93
94
95
96
# File 'lib/volt/reactive/reactive_count.rb', line 86

def teardown_listeners
  @added_tracker.remove
  @added_tracker = nil

  @removed_tracker.remove
  @removed_tracker = nil

  change_cell_count(0)

  @cell_trackers = nil
end