///|
test "generic comparison" {
// Works with numbers
inspect(@cmp.maximum(3, 4), content="4")
inspect(@cmp.minimum(3, 4), content="3")
debug_inspect(@cmp.minmax(3, 4), content="(3, 4)")
}///|
test "reverse comparison" {
let a = @cmp.Reverse(1)
let b = @cmp.Reverse(2)
// Normal comparison: 1 < 2, but reversed: 1 > 2
inspect(a.compare(b), content="1")
inspect(b.compare(a), content="-1")
// Can be used with generic comparison functions
@debug.debug_inspect(@cmp.maximum(a, b), content="Reverse(1)")
@debug.debug_inspect(@cmp.minimum(a, b), content="Reverse(2)")
}///|
test "reverse with arrays" {
// Create an array with reversed integers for descending sort
let arr : ReadOnlyArray[@cmp.Reverse[Int]] = [
Reverse(3),
Reverse(1),
Reverse(4),
Reverse(2),
]
// When sorted, the array will be in descending order of the wrapped values
@debug.debug_inspect(arr[0], content="Reverse(3)") // Access first element
}///|
priv struct Person {
name : String
age : Int
} derive(Debug)
///|
test "cmp_by_key" {
// Compare strings by their length
let s1 = "hello"
let s2 = "hi"
let longer = @cmp.maximum_by_key(s1, s2, String::length)
inspect(longer, content="hello")
// Compare structs by a specific field
let alice = { name: "Alice", age: 25 }
let bob = { name: "Bob", age: 30 }
let younger = @cmp.minimum_by_key(alice, bob, p => p.age)
debug_inspect(
younger,
content=(
#|{ name: "Alice", age: 25 }
),
)
// When keys are equal, the first argument is considered the minimum
let p1 = ("first", 1)
let p2 = ("second", 1)
let snd = (p : (_, _)) => p.1
@debug.assert_eq(@cmp.minimum_by_key(p1, p2, snd), p1)
@debug.assert_eq(@cmp.maximum_by_key(p1, p2, snd), p2)
}test {
let a = @cmp.Reverse(1)
let b = @cmp.Reverse(2)
inspect(a.compare(b), content="1") // 1 > 2 in reversed order
inspect(b.compare(a), content="-1") // 2 < 1 in reversed order
inspect(a == a, content="true") // Equality works correctly
@debug.debug_inspect(a, content="Reverse(1)") // Shows wrapped value
}test {
inspect(@cmp.maximum(1, 2), content="2")
inspect(@cmp.maximum(2, 1), content="2")
let fst = []
let snd = []
@cmp.maximum(fst, snd).push(0)
debug_inspect(snd, content="[0]")
}test {
inspect(@cmp.maximum_by_key(1, -2, Int::abs), content="-2")
inspect(@cmp.maximum_by_key(-2, 1, Int::abs), content="-2")
inspect(@cmp.maximum_by_key(-2, 2, Int::abs), content="2")
}test {
inspect(@cmp.minimum(1, 2), content="1")
inspect(@cmp.minimum(2, 1), content="1")
let fst = []
let snd = []
@cmp.minimum(fst, snd).push(0)
debug_inspect(fst, content="[0]")
}test {
inspect(@cmp.minimum_by_key(1, -2, Int::abs), content="1")
inspect(@cmp.minimum_by_key(-2, 1, Int::abs), content="1")
inspect(@cmp.minimum_by_key(-2, 2, Int::abs), content="-2")
}test {
debug_inspect(@cmp.minmax(1, 2), content="(1, 2)")
debug_inspect(@cmp.minmax(2, 1), content="(1, 2)")
}test {
debug_inspect(@cmp.minmax_by_key(1, -2, Int::abs), content="(1, -2)")
debug_inspect(@cmp.minmax_by_key(-2, 1, Int::abs), content="(1, -2)")
debug_inspect(@cmp.minmax_by_key(-2, 2, Int::abs), content="(-2, 2)")
}Install
Installed by default