Sha256: c19e217bb6bcf6442965b238c42545f1b22df893eba00581414773f9b3da58e8

Contents?: true

Size: 1.03 KB

Versions: 5

Compression:

Stored size: 1.03 KB

Contents

# typed: true
require 'ddtrace/utils/sequence'

module Datadog
  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 = Utils::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

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
ddtrace-0.54.2 lib/ddtrace/utils/object_set.rb
ddtrace-0.54.1 lib/ddtrace/utils/object_set.rb
ddtrace-0.54.0 lib/ddtrace/utils/object_set.rb
ddtrace-0.53.0 lib/ddtrace/utils/object_set.rb
ddtrace-0.52.0 lib/ddtrace/utils/object_set.rb