Sha256: fb50b5f88e5f1049699dd21484514fcf5bd2c8ff9c914fa175ddda68605c4d68

Contents?: true

Size: 1.12 KB

Versions: 8

Compression:

Stored size: 1.12 KB

Contents

# frozen_string_literal: true

require_relative 'sequence'

module Datadog
  module Core
    module Utils
      # Acts as a unique dictionary of objects
      class ObjectSet
        # You can provide a block that defines how the key
        # for this message type is resolved.
        def initialize(seed = 0, &block)
          @sequence = Sequence.new(seed)
          @items = {}
          @key_block = block
        end

        # Submit an array of arguments that define the message.
        # If they match an existing message, it will return the
        # matching object. If it doesn't match, it will yield to
        # the block with the next ID & args given.
        def fetch(*args)
          # TODO: Array hashing is **really** expensive, we probably want to get rid of it in the future
          key = @key_block ? @key_block.call(*args) : args.hash
          @items[key] ||= yield(@sequence.next, *args)
        end

        def length
          @items.length
        end

        def objects
          @items.values
        end

        def freeze
          super
          @items.freeze
        end
      end
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
ddtrace-1.14.0 lib/datadog/core/utils/object_set.rb
ddtrace-1.13.1 lib/datadog/core/utils/object_set.rb
ddtrace-1.13.0 lib/datadog/core/utils/object_set.rb
ddtrace-1.12.1 lib/datadog/core/utils/object_set.rb
ddtrace-1.12.0 lib/datadog/core/utils/object_set.rb
ddtrace-1.11.1 lib/datadog/core/utils/object_set.rb
ddtrace-1.11.0 lib/datadog/core/utils/object_set.rb
ddtrace-1.11.0.beta1 lib/datadog/core/utils/object_set.rb