Sha256: d56dbe981a5901715dfd12fc45d1dd414b2f2cf45fed8a3037ecfd65b9d0c7ee

Contents?: true

Size: 1.35 KB

Versions: 10

Compression:

Stored size: 1.35 KB

Contents

require 'concurrent/map'

module ROM
  # Thread-safe cache used by various rom components
  #
  # @api private
  class Cache
    attr_reader :objects

    # @api private
    class Namespaced
      # @api private
      attr_reader :cache

      # @api private
      attr_reader :namespace

      # @api private
      def initialize(cache, namespace)
        @cache = cache
        @namespace = namespace.to_sym
      end

      # @api private
      def [](key)
        cache[[namespace, key].hash]
      end

      # @api private
      def fetch_or_store(*args, &block)
        cache.fetch_or_store([namespace, args.hash].hash, &block)
      end

      # @api private
      def size
        cache.size
      end

      # @api private
      def inspect
        %(#<#{self.class} size=#{size}>)
      end
    end

    # @api private
    def initialize
      @objects = Concurrent::Map.new
      @namespaced = {}
    end

    def [](key)
      cache[key]
    end

    # @api private
    def fetch_or_store(*args, &block)
      objects.fetch_or_store(args.hash, &block)
    end

    # @api private
    def size
      objects.size
    end

    # @api private
    def namespaced(namespace)
      @namespaced[namespace] ||= Namespaced.new(objects, namespace)
    end

    # @api private
    def inspect
      %(#<#{self.class} size=#{size} namespaced=#{@namespaced.inspect}>)
    end
  end
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
rom-core-4.2.1 lib/rom/cache.rb
rom-core-4.2.0 lib/rom/cache.rb
rom-core-4.1.2 lib/rom/cache.rb
rom-core-4.1.1 lib/rom/cache.rb
rom-core-4.1.0 lib/rom/cache.rb
rom-core-4.0.2 lib/rom/cache.rb
rom-core-4.0.1 lib/rom/cache.rb
rom-core-4.0.0 lib/rom/cache.rb
rom-core-4.0.0.rc2 lib/rom/cache.rb
rom-core-4.0.0.rc1 lib/rom/cache.rb