Commits

Anonymous committed 2398077

Add a ConstraintHandler.

This is a kind of strategy object for the refactoring:

filter_constraints_cell_constraint_step().

Comments (0)

Files changed (1)

solver/ruby/kakuro-board.rb

             end
         end
 
-        def calc_total_mask(init_pos, dir)
-            return dir_cells_enum(init_pos, dir).map { |x| x.verdicts_mask }.
-                kakuro_combine_masks
+        class ConstraintHandler
+            def initialize(board, init_pos, dir)
+                @board = board
+                @init_pos = init_pos
+                @dir = dir
+            end
+
+            def run
+                @init_cell = @board.cell(@init_pos)
+                @constraint = @init_cell.constraint(@dir)
+
+                return @constraint && set_new_constraint
+            end
+
+            private
+            def set_new_constraint
+                total_mask = @board.calc_total_mask(@init_pos, @dir)
+
+                return @init_cell.set_new_constraint(
+                    @dir,
+                    @constraint.select { |c| (c & total_mask) == c }
+                )
+            end
         end
 
         def filter_constraints_cell_constraint_step(init_pos, dir)
-            init_cell = cell(init_pos)
-            constraint = init_cell.constraint(dir)
-
-            if (constraint)
-                total_mask = calc_total_mask(init_pos, dir)
-
-                return init_cell.set_new_constraint(
-                    dir,
-                    constraint.select { |c| (c & total_mask) == c }
-                )
-            else
-                return false
-            end
+            return ConstraintHandler.new(self, init_pos, dir).run
         end
 
         def filter_constraints_cell_step(init_pos)
 
         public
 
+        def calc_total_mask(init_pos, dir)
+            return dir_cells_enum(init_pos, dir).map { |x| x.verdicts_mask }.
+                kakuro_combine_masks
+        end
+
         def dir_iter_params(dir)
             return ((dir == DOWN) \
                 ? ['y',@height,'bump_y'] \
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.