Module: Ace::Assign::Atoms::NumberGenerator
- Defined in:
- lib/ace/assign/atoms/number_generator.rb
Overview
Pure functions for generating step numbers.
Follows the numbering convention:
-
Main steps: 010, 020, 030 (10-step gaps for injection room)
-
Sub-steps: 010.01, 010.02 (2-digit padding)
-
Sub-sub-steps: 010.01.01 (3 levels max)
-
Dynamic injection: 041 after 040
Constant Summary collapse
- DEFAULT_INCREMENT =
Default increment between main steps
10- DEFAULT_START =
Default starting number
10
Class Method Summary collapse
-
.from_index(index, increment: DEFAULT_INCREMENT) ⇒ String
Format a number from index (0-based) to step number.
-
.next_after(base, existing = []) ⇒ String
Generate the next number after a given step (for dynamic injection).
-
.next_main(last, increment: DEFAULT_INCREMENT) ⇒ String
Generate the next main step number.
-
.parse(number) ⇒ Hash
Parse a step number into its components.
-
.sub_subtask(parent, sequence) ⇒ String
Generate a sub-sub-step number.
-
.subtask(parent, sequence) ⇒ String
Generate a sub-step number.
-
.subtask_of?(number, parent) ⇒ Boolean
Check if a number is a sub-step of another.
Class Method Details
.from_index(index, increment: DEFAULT_INCREMENT) ⇒ String
Format a number from index (0-based) to step number
104 105 106 |
# File 'lib/ace/assign/atoms/number_generator.rb', line 104 def self.from_index(index, increment: DEFAULT_INCREMENT) format("%03d", (index + 1) * increment) end |
.next_after(base, existing = []) ⇒ String
Generate the next number after a given step (for dynamic injection)
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/ace/assign/atoms/number_generator.rb', line 42 def self.next_after(base, existing = []) # Extract main part main_part = base.split(".").first.to_i # Find existing numbers in the range base+1 to base+9 range_numbers = existing.map { |n| n.split(".").first.to_i } .select { |n| n > main_part && n < main_part + 10 } # Find next available next_num = main_part + 1 while range_numbers.include?(next_num) next_num += 1 end format("%03d", next_num) end |
.next_main(last, increment: DEFAULT_INCREMENT) ⇒ String
Generate the next main step number
25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/ace/assign/atoms/number_generator.rb', line 25 def self.next_main(last, increment: DEFAULT_INCREMENT) return format("%03d", DEFAULT_START) if last.nil? # Extract the main number (before any dots) main_part = last.split(".").first current = main_part.to_i # Round up to next increment next_num = ((current / increment) + 1) * increment format("%03d", next_num) end |
.parse(number) ⇒ Hash
Parse a step number into its components
81 82 83 84 85 86 87 88 |
# File 'lib/ace/assign/atoms/number_generator.rb', line 81 def self.parse(number) parts = number.split(".").map(&:to_i) { main: parts.first, parts: parts, depth: parts.size } end |
.sub_subtask(parent, sequence) ⇒ String
Generate a sub-sub-step number
73 74 75 |
# File 'lib/ace/assign/atoms/number_generator.rb', line 73 def self.sub_subtask(parent, sequence) "#{parent}.#{format("%02d", sequence)}" end |
.subtask(parent, sequence) ⇒ String
Generate a sub-step number
64 65 66 |
# File 'lib/ace/assign/atoms/number_generator.rb', line 64 def self.subtask(parent, sequence) "#{parent}.#{format("%02d", sequence)}" end |
.subtask_of?(number, parent) ⇒ Boolean
Check if a number is a sub-step of another
95 96 97 |
# File 'lib/ace/assign/atoms/number_generator.rb', line 95 def self.subtask_of?(number, parent) number.start_with?("#{parent}.") end |