Class: LaunchDarkly::Impl::EvaluatorStack

Inherits:
Object
  • Object
show all
Defined in:
lib/ldclient-rb/impl/evaluator.rb

Overview

A helper class for managing cycle detection.

Each time a method sees a new flag or segment, they can push that object’s key onto the stack. Once processing for that object has finished, you can call pop to remove it.

Because the most common use case would be a flag or segment without ANY prerequisites, this stack has a small optimization in place– the stack is not created until absolutely necessary.

Since:

  • 5.5.0

Instance Method Summary collapse

Constructor Details

#initialize(original) ⇒ EvaluatorStack

Returns a new instance of EvaluatorStack.

Parameters:

  • original (String, nil)

Since:

  • 5.5.0



62
63
64
65
66
# File 'lib/ldclient-rb/impl/evaluator.rb', line 62

def initialize(original)
  @original = original
  # @type [Array<String>, nil]
  @stack = nil
end

Instance Method Details

#include?(key) ⇒ Boolean

Parameters:

  • key (String)

Returns:

  • (Boolean)

Since:

  • 5.5.0



92
93
94
95
96
97
# File 'lib/ldclient-rb/impl/evaluator.rb', line 92

def include?(key)
  return true if key == @original
  return false if @stack.nil?

  @stack.include? key
end

#popObject

Since:

  • 5.5.0



83
84
85
86
# File 'lib/ldclient-rb/impl/evaluator.rb', line 83

def pop
  return if @stack.nil? || @stack.empty?
  @stack.pop
end

#push(key) ⇒ Object

Parameters:

  • key (String)

Since:

  • 5.5.0



69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/ldclient-rb/impl/evaluator.rb', line 69

def push(key)
  # No need to store the key if we already have a record in our instance
  # variable.
  return if @original == key

  # The common use case is that flags/segments won't have prereqs, so we
  # don't allocate the stack memory until we absolutely must.
  if @stack.nil?
    @stack = []
  end

  @stack.push(key)
end