Module: Ace::Assign::Atoms::StepSorter
- Defined in:
- lib/ace/assign/atoms/step_sorter.rb
Overview
Pure functions for sorting step files lexicographically.
Steps are sorted by their numeric components: 010 < 010.01 < 010.01.01 < 010.02 < 020
Class Method Summary collapse
-
.compare(a, b) ⇒ Integer
Compare two step numbers.
-
.number_key(number) ⇒ Array<Integer>
Generate a sort key for a step number.
-
.sort(filenames) ⇒ Array<String>
Sort filenames lexicographically by step number.
-
.sort_key(filename) ⇒ Array<Integer>
Generate a sort key for a filename.
-
.sort_numbers(numbers) ⇒ Array<String>
Sort step numbers directly.
Class Method Details
.compare(a, b) ⇒ Integer
Compare two step numbers
60 61 62 |
# File 'lib/ace/assign/atoms/step_sorter.rb', line 60 def self.compare(a, b) number_key(a) <=> number_key(b) end |
.number_key(number) ⇒ Array<Integer>
Generate a sort key for a step number
50 51 52 53 |
# File 'lib/ace/assign/atoms/step_sorter.rb', line 50 def self.number_key(number) parts = number.split(".").map(&:to_i) parts + Array.new(3 - parts.size, 0) end |
.sort(filenames) ⇒ Array<String>
Sort filenames lexicographically by step number
15 16 17 |
# File 'lib/ace/assign/atoms/step_sorter.rb', line 15 def self.sort(filenames) filenames.sort_by { |f| sort_key(f) } end |
.sort_key(filename) ⇒ Array<Integer>
Generate a sort key for a filename
The key is an array of integers that can be compared to produce correct lexicographic ordering.
26 27 28 29 30 31 32 33 34 35 36 |
# File 'lib/ace/assign/atoms/step_sorter.rb', line 26 def self.sort_key(filename) # Extract number from filename (strip .st.md or .r.md extension) base = filename.sub(/\.(ph|r)\.md$/, "") number_part = base.split("-").first # Split by dots and convert to integers parts = number_part.split(".").map(&:to_i) # Pad to 3 parts for consistent comparison parts + Array.new(3 - parts.size, 0) end |
.sort_numbers(numbers) ⇒ Array<String>
Sort step numbers directly
42 43 44 |
# File 'lib/ace/assign/atoms/step_sorter.rb', line 42 def self.sort_numbers(numbers) numbers.sort_by { |n| number_key(n) } end |