From 588c5e21c74da1f0a576ad07f2d0f5336b8cd522 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Thu, 25 Jul 2024 10:42:43 -0400 Subject: [PATCH] Cache ItemSet#leading_item_sets return values - #28 --- lib/propane/parser/item_set.rb | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/lib/propane/parser/item_set.rb b/lib/propane/parser/item_set.rb index 41ca110..188436c 100644 --- a/lib/propane/parser/item_set.rb +++ b/lib/propane/parser/item_set.rb @@ -99,21 +99,24 @@ class Propane # @return [Set] # Set of all ItemSets that lead up to this ItemSet. def leading_item_sets - result = Set.new - eval_sets = Set[self] - evaled = Set.new - while eval_sets.size > 0 - eval_set = eval_sets.first - eval_sets.delete(eval_set) - evaled << eval_set - eval_set.in_sets.each do |in_set| - result << in_set - unless evaled.include?(in_set) - eval_sets << in_set + @_leading_item_sets ||= + begin + result = Set.new + eval_sets = Set[self] + evaled = Set.new + while eval_sets.size > 0 + eval_set = eval_sets.first + eval_sets.delete(eval_set) + evaled << eval_set + eval_set.in_sets.each do |in_set| + result << in_set + unless evaled.include?(in_set) + eval_sets << in_set + end + end end + result end - end - result end # Represent the ItemSet as a String.