1# frozen_string_literal: true
2
3module Gitlab
4  module Utils
5    module StrongMemoize
6      # Instead of writing patterns like this:
7      #
8      #     def trigger_from_token
9      #       return @trigger if defined?(@trigger)
10      #
11      #       @trigger = Ci::Trigger.find_by_token(params[:token].to_s)
12      #     end
13      #
14      # We could write it like:
15      #
16      #     include Gitlab::Utils::StrongMemoize
17      #
18      #     def trigger_from_token
19      #       strong_memoize(:trigger) do
20      #         Ci::Trigger.find_by_token(params[:token].to_s)
21      #       end
22      #     end
23      #
24      def strong_memoize(name)
25        if strong_memoized?(name)
26          instance_variable_get(ivar(name))
27        else
28          instance_variable_set(ivar(name), yield)
29        end
30      end
31
32      def strong_memoized?(name)
33        instance_variable_defined?(ivar(name))
34      end
35
36      def clear_memoization(name)
37        remove_instance_variable(ivar(name)) if instance_variable_defined?(ivar(name))
38      end
39
40      private
41
42      def ivar(name)
43        "@#{name}"
44      end
45    end
46  end
47end
48