Sha256: bee9513124b7b1104cb764fbf2f42a852aa21ceb19764038e0ce9e2a1e0958fc

Contents?: true

Size: 1.69 KB

Versions: 36

Compression:

Stored size: 1.69 KB

Contents

# frozen_string_literal: true
require "graphql/execution/lazy/lazy_method_map"
require "graphql/execution/lazy/resolve"
module GraphQL
  module Execution
    # 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:
    # - It has only two states, not-resolved and resolved
    # - It has no error-catching functionality
    # @api private
    class Lazy
      # Traverse `val`, lazily resolving any values along the way
      # @param val [Object] A data structure containing mixed plain values and `Lazy` instances
      # @return void
      def self.resolve(val)
        Resolve.resolve(val)
      end

      # 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)
      def initialize(&get_value_func)
        @get_value_func = get_value_func
        @resolved = false
      end

      # @return [Object] The wrapped value, calling the lazy block if necessary
      def value
        if !@resolved
          @resolved = true
          @value = begin
            @get_value_func.call
          rescue GraphQL::ExecutionError => err
            err
          end
        end
        @value
      end

      # @return [Lazy] A {Lazy} whose value depends on another {Lazy}, plus any transformations in `block`
      def then
        self.class.new {
          yield(value)
        }
      end

      # This can be used for fields which _had no_ lazy results
      # @api private
      NullResult = Lazy.new(){}
      NullResult.value
    end
  end
end

Version data entries

36 entries across 36 versions & 1 rubygems

Version Path
graphql-1.8.3 lib/graphql/execution/lazy.rb
graphql-1.8.2 lib/graphql/execution/lazy.rb
graphql-1.8.1 lib/graphql/execution/lazy.rb
graphql-1.8.0 lib/graphql/execution/lazy.rb
graphql-1.8.0.pre11 lib/graphql/execution/lazy.rb
graphql-1.8.0.pre10 lib/graphql/execution/lazy.rb
graphql-1.7.14 lib/graphql/execution/lazy.rb
graphql-1.8.0.pre9 lib/graphql/execution/lazy.rb
graphql-1.8.0.pre8 lib/graphql/execution/lazy.rb
graphql-1.7.13 lib/graphql/execution/lazy.rb
graphql-1.8.0.pre7 lib/graphql/execution/lazy.rb
graphql-1.7.12 lib/graphql/execution/lazy.rb
graphql-1.7.11 lib/graphql/execution/lazy.rb
graphql-1.7.10 lib/graphql/execution/lazy.rb
graphql-1.8.0.pre6 lib/graphql/execution/lazy.rb
graphql-1.8.0.pre5 lib/graphql/execution/lazy.rb
graphql-1.7.9 lib/graphql/execution/lazy.rb
graphql-1.8.0.pre4 lib/graphql/execution/lazy.rb
graphql-1.8.0.pre3 lib/graphql/execution/lazy.rb
graphql-1.7.8 lib/graphql/execution/lazy.rb