sort-two-lists-depending-on-order-of-one.zig

Working version(s):
0.13.00.14.1

Failing version(s):
0.15.20.16.0-dev.2637+6a9510c0e

Code

const std = @import("std");

test {
    var letters = [_]u8{ 'A', 'B', 'C', 'G', 'E', 'F', 'D' };
    var numbers = [_]u8{ 0, 1, 2, 6, 4, 5, 3 };

    const Context = struct {
        letters: []u8,
        numbers: []u8,
        pub fn lessThan(ctx: @This(), lhs: usize, rhs: usize) bool {
            return ctx.letters[lhs] < ctx.letters[rhs];
        }

        pub fn swap(ctx: @This(), lhs: usize, rhs: usize) void {
            std.mem.swap(u8, &ctx.letters[lhs], &ctx.letters[rhs]);
            std.mem.swap(u8, &ctx.numbers[lhs], &ctx.numbers[rhs]);
        }
    };

    const ctx: Context = .{ .letters = &letters, .numbers = &numbers };
    std.sort.pdqContext(0, numbers.len, ctx);
    for (letters, numbers, 0..) |s, r, i| {
        try std.testing.expectEqual(i, r);
        try std.testing.expectEqual('A' + i, s);
    }
}