class Dry::Effects::Effects::Cache

Public Class Methods

new(scope = nil, shared: false, **kw) click to toggle source
Calls superclass method
# File lib/dry/effects/effects/cache.rb, line 13
def initialize(scope = nil, shared: false, **kw)
  super()

  if !kw.empty?
    scope, as = kw.to_a[0]
  elsif scope.is_a?(::Hash)
    scope, as = scope.to_a[0]
  else
    as = :cache
  end

  fetch_or_store = CacheEffect.new(
    type: :cache,
    name: :fetch_or_store,
    scope: scope
  )

  key = key(shared)

  module_eval do
    Array(as).each do |meth|
      define_method(meth) do |*args, &block|
        if block
          eff = fetch_or_store.(key.(self, args), block)
        else
          eff = fetch_or_store.(key.(self, args, method: meth), -> { super(*args) })
        end

        ::Dry::Effects.yield(eff)
      end
    end
  end
end

Public Instance Methods

cache_key(instance, args, method: Undefined) click to toggle source
# File lib/dry/effects/effects/cache.rb, line 63
def cache_key(instance, args, method: Undefined)
  if Undefined.equal?(method)
    [instance, args]
  else
    [instance, method, args]
  end
end
key(shared) click to toggle source
# File lib/dry/effects/effects/cache.rb, line 47
def key(shared)
  if shared
    method(:shared_cache_key)
  else
    method(:cache_key)
  end
end
shared_cache_key(_, args, method: Undefined) click to toggle source
# File lib/dry/effects/effects/cache.rb, line 55
def shared_cache_key(_, args, method: Undefined)
  if Undefined.equal?(method)
    args
  else
    [method, args]
  end
end