class GraphQL::Analysis::ReducerState

Attributes

errors[RW]
memo[RW]
reducer[R]

Public Class Methods

new(reducer, query) click to toggle source
# File lib/graphql/analysis/reducer_state.rb, line 7
def initialize(reducer, query)
  @reducer = reducer
  @memo = initialize_reducer(reducer, query)
  @errors = []
end

Public Instance Methods

call(visit_type, irep_node) click to toggle source
# File lib/graphql/analysis/reducer_state.rb, line 13
def call(visit_type, irep_node)
  @memo = @reducer.call(@memo, visit_type, irep_node)
rescue AnalysisError => err
  @errors << err
end
finalize_reducer() click to toggle source

Respond with any errors, if found. Otherwise, if the reducer accepts `final_value`, send it the last memo value. Otherwise, use the last value from the traversal. @return [Any] final memo value

# File lib/graphql/analysis/reducer_state.rb, line 23
def finalize_reducer
  if @errors.any?
    @errors
  elsif reducer.respond_to?(:final_value)
    reducer.final_value(@memo)
  else
    @memo
  end
end

Private Instance Methods

initialize_reducer(reducer, query) click to toggle source

If the reducer has an `initial_value` method, call it and store the result as `memo`. Otherwise, use `nil` as memo. @return [Any] initial memo value

# File lib/graphql/analysis/reducer_state.rb, line 38
def initialize_reducer(reducer, query)
  if reducer.respond_to?(:initial_value)
    reducer.initial_value(query)
  else
    nil
  end
end