Class: Volt::Dependency

Inherits:
Object show all
Defined in:
lib/volt/reactive/dependency.rb

Overview

Dependencies are used to track the current computation so it can be re-run at a later point if this dependency changes.

You can also pass an on_dep and on_stop_dep proc’s to #initialize.

Instance Method Summary collapse

Constructor Details

#initialize(on_dep = nil, on_stop_dep = nil) ⇒ Dependency

Setup a new dependency.

Parameters:

  • on_dep (Proc) (defaults to: nil)

    a proc to be called the first time a computation depends on this dependency.

  • on_stop_dep (Proc) (defaults to: nil)

    a proc to be called when no computations are depending on this dependency anymore.



15
16
17
18
19
# File 'lib/volt/reactive/dependency.rb', line 15

def initialize(on_dep = nil, on_stop_dep = nil)
  @dependencies = Set.new
  @on_dep = on_dep
  @on_stop_dep = on_stop_dep
end

Instance Method Details

#changed!Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/volt/reactive/dependency.rb', line 47

def changed!
  deps = @dependencies

  # If no deps, dependency has been removed
  return unless deps

  @dependencies = Set.new

  deps.each(&:invalidate!)

  # Call on stop dep here because we are clearing out the @dependencies, so
  # it won't trigger on the invalidates
  @on_stop_dep.call if @on_stop_dep
end

#dependObject



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/volt/reactive/dependency.rb', line 21

def depend
  # If there is no @dependencies, don't depend because it has been removed
  return unless @dependencies

  current = Computation.current
  if current
    added = @dependencies.add?(current)

    if added
      # The first time the dependency is depended on by this computation, we call on_dep
      @on_dep.call if @on_dep && @dependencies.size == 1

      current.on_invalidate do
        # If @dependencies is nil, this Dependency has been removed
        if @dependencies
          # For set, .delete returns a boolean if it was deleted
          deleted = @dependencies.delete?(current)

          # Call on stop dep if no more deps
          @on_stop_dep.call if @on_stop_dep && deleted && @dependencies.size == 0
        end
      end
    end
  end
end

#removeObject

Called when a dependency is no longer needed



63
64
65
66
# File 'lib/volt/reactive/dependency.rb', line 63

def remove
  changed!
  @dependencies = nil
end