From 8a167554a9dae4ab10f5a56124a598227bf5e3ed Mon Sep 17 00:00:00 2001 From: "http://jneen.net/" Date: Mon, 7 Aug 2017 12:36:13 -0700 Subject: reduce iterations by keeping a count of remaining enablers rather than iterating the whole remaining step set with .all?(&:prevent?) --- lib/declarative_policy/runner.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/declarative_policy/runner.rb b/lib/declarative_policy/runner.rb index b5c615da4e3..1122b9e42ec 100644 --- a/lib/declarative_policy/runner.rb +++ b/lib/declarative_policy/runner.rb @@ -141,13 +141,14 @@ module DeclarativePolicy end steps = Set.new(@steps) + remaining_enablers = steps.count { |s| s.enable? } loop do return if steps.empty? # if the permission hasn't yet been enabled and we only have # prevent steps left, we short-circuit the state here - @state.prevent! if !@state.enabled? && steps.all?(&:prevent?) + @state.prevent! if !@state.enabled? && remaining_enablers == 0 lowest_score = Float::INFINITY next_step = nil @@ -162,6 +163,8 @@ module DeclarativePolicy steps.delete(next_step) + remaining_enablers -= 1 if next_step.enable? + yield next_step, lowest_score end end -- cgit v1.2.1 From 15bb6e1ed7a4fb1d6554e193497836b79bc26bda Mon Sep 17 00:00:00 2001 From: "http://jneen.net/" Date: Mon, 7 Aug 2017 12:48:22 -0700 Subject: more eagerly bail when the state is prevented --- lib/declarative_policy/runner.rb | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/declarative_policy/runner.rb b/lib/declarative_policy/runner.rb index 1122b9e42ec..56afd1f1392 100644 --- a/lib/declarative_policy/runner.rb +++ b/lib/declarative_policy/runner.rb @@ -76,6 +76,8 @@ module DeclarativePolicy @state = State.new steps_by_score do |step, score| + return if !debug && @state.prevented? + passed = nil case step.action when :enable then @@ -93,10 +95,7 @@ module DeclarativePolicy # been prevented. unless @state.prevented? passed = step.pass? - if passed - @state.prevent! - return unless debug - end + @state.prevent! if passed end debug << inspect_step(step, score, passed) if debug -- cgit v1.2.1