gitlab-org--gitlab-foss/lib/gitlab/utils/strong_memoize.rb

50 lines
1.1 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
require_dependency 'gitlab/utils'
2017-11-13 15:27:30 +00:00
module Gitlab
module Utils
module StrongMemoize
# Instead of writing patterns like this:
#
# def trigger_from_token
# return @trigger if defined?(@trigger)
#
# @trigger = Ci::Trigger.find_by_token(params[:token].to_s)
# end
#
# We could write it like:
#
# include Gitlab::Utils::StrongMemoize
#
2017-11-13 15:27:30 +00:00
# def trigger_from_token
# strong_memoize(:trigger) do
# Ci::Trigger.find_by_token(params[:token].to_s)
# end
# end
#
def strong_memoize(name)
if strong_memoized?(name)
instance_variable_get(ivar(name))
2017-11-13 15:27:30 +00:00
else
instance_variable_set(ivar(name), yield)
2017-11-13 15:27:30 +00:00
end
end
def strong_memoized?(name)
instance_variable_defined?(ivar(name))
end
def clear_memoization(name)
remove_instance_variable(ivar(name)) if instance_variable_defined?(ivar(name))
end
private
def ivar(name)
"@#{name}"
end
2017-11-13 15:27:30 +00:00
end
end
end