Stable multi-key sort of Nim records with nulls
Nim
import std/[algorithm, options]
type User = object
name: string
score: Option[int]
let users = @[User(name: "ana", score: some(10)),
User(name: "bob", score: none(int)),
User(name: "cy", score: some(3))]
proc cmpUser(a, b: User): int =
if a.score.isNone or b.score.isNone:
return cmp(a.score.isNone, b.score.isNone) # nulls last
result = -cmp(a.score.get, b.score.get) # score desc
if result == 0: result = cmp(a.name, b.name)
var sorted = users
sorted.sort(cmpUser)
for u in sorted: echo u.name, " ", u.score