Stable multi-key sort with nil values last
Crystal
record Person, name : String, age : Int32?, id : Int32
people = [
Person.new("Ada", 36, 1),
Person.new("Bo", nil, 2),
Person.new("Cy", 36, 3),
]
indexed = [] of Tuple(Person, Int32)
people.each_with_index { |person, i| indexed << {person, i} }
# nil ages last; index keeps equal keys stable
sorted = indexed.sort_by { |(person, i)| {person.age.nil? ? 1 : 0, person.age || 0, i} }
.map { |(person, _i)| person }
puts sorted.map(&.name)