Sha256: 17fcbd02df1674d3223a943ea1bc4656985e59eb257ef68777f827b63f76a45c

Contents?: true

Size: 1.67 KB

Versions: 1

Compression:

Stored size: 1.67 KB

Contents

require 'mrcr/cache/version'
require 'concurrent/map'

module Mrcr
  # Allows you to cache call results that are solely determined by arguments.
  #
  # @example
  #   require 'mrcr/cache'
  #
  #   class Foo
  #     extend Mrcr::Cache
  #
  #     def heavy_computation(arg1, arg2)
  #       fetch_or_store(arg1, arg2) { arg1 ^ arg2 }
  #     end
  #   end
  #
  # @api public
  module Cache
    # @api private
    def self.extended(klass)
      super
      klass.include(Methods)
      klass.instance_variable_set(:@__cache__, Concurrent::Map.new)
    end

    # @api private
    def inherited(klass)
      super
      klass.instance_variable_set(:@__cache__, cache)
    end

    # @api private
    def cache
      @__cache__
    end

    # Caches a result of the block evaluation
    #
    # @param [Array<Object>] args List of hashable objects
    # @yield An arbitrary block
    #
    # @note beware Proc instance hashes are not equal, i.e. -> { 1 }.hash != -> { 1 }.hash,
    #       this means you shouldn't pass Procs in args unless you're sure
    #       they are always the same instances, otherwise you introduce a memory leak
    #
    # @return [Object] block's return value (cached for subsequent calls with the same argument values)
    def fetch_or_store(*args, &block)
      cache.fetch_or_store(args.hash, &block)
    end

    # Instance methods
    module Methods
      # Delegates call to the class-level method
      #
      # @param [Array<Object>] args List of hashable objects
      # @yield An arbitrary block
      #
      # @return [Object] block's return value
      def fetch_or_store(*args, &block)
        self.class.fetch_or_store(*args, &block)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
mrcr-cache-0.1.0 lib/mrcr/cache.rb