class GraphQL::Execution::Lazy

This wraps a value which is available, but not yet calculated, like a promise or future.

Calling `#value` will trigger calculation & return the “lazy” value.

This is an itty-bitty promise-like object, with key differences:

@api private

Constants

NullResult

This can be used for fields which _had no_ lazy results @api private

Public Class Methods

new(&get_value_func) click to toggle source

Create a {Lazy} which will get its inner value by calling the block @param get_value_func [Proc] a block to get the inner value (later)

# File lib/graphql/execution/lazy.rb, line 23
def initialize(&get_value_func)
  @get_value_func = get_value_func
  @resolved = false
end
resolve(val) click to toggle source

Traverse `val`, lazily resolving any values along the way @param val [Object] A data structure containing mixed plain values and `Lazy` instances @return void

# File lib/graphql/execution/lazy.rb, line 17
def self.resolve(val)
  Resolve.resolve(val)
end

Public Instance Methods

then() { |value| ... } click to toggle source

@return [Lazy] A {Lazy} whose value depends on another {Lazy}, plus any transformations in `block`

# File lib/graphql/execution/lazy.rb, line 46
def then
  self.class.new {
    yield(value)
  }
end
value() click to toggle source

@return [Object] The wrapped value, calling the lazy block if necessary

# File lib/graphql/execution/lazy.rb, line 29
def value
  if !@resolved
    @resolved = true
    @value = begin
      v = @get_value_func.call
      if v.is_a?(Lazy)
        v = v.value
      end
      v
    rescue GraphQL::ExecutionError => err
      err
    end
  end
  @value
end