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

Class Method Details

.compare(a, b) ⇒ Integer

Compare two step numbers

Parameters:

  • a (String)

    First step number

  • b (String)

    Second step number

Returns:

  • (Integer)

    -1, 0, or 1



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

Parameters:

  • number (String)

    Step number

Returns:

  • (Array<Integer>)

    Sort key



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

Parameters:

  • filenames (Array<String>)

    Array of filenames

Returns:

  • (Array<String>)

    Sorted filenames



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.

Parameters:

  • filename (String)

    Filename to generate key for

Returns:

  • (Array<Integer>)

    Sort key



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

Parameters:

  • numbers (Array<String>)

    Array of step numbers

Returns:

  • (Array<String>)

    Sorted step numbers



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