Something went wrong. Try again.
zig utility library forked from karlseguin.tngl.sh/zul
Something went wrong. Try again.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192const std = @import("std");
pub const Direction = enum { asc, desc,
pub fn toOrder(self: Direction) std.math.Order { return switch (self) { .asc => .lt, .desc => .gt, }; }};
pub fn strings(values: [][]const u8, direction: Direction) void { std.mem.sortUnstable([]const u8, values, direction.toOrder(), struct { fn order(d: std.math.Order, lhs: []const u8, rhs: []const u8) bool { return std.mem.order(u8, lhs, rhs) == d; } }.order);}
pub fn asciiIgnoreCase(values: [][]const u8, direction: Direction) void { std.mem.sortUnstable([]const u8, values, direction.toOrder(), struct { fn order(d: std.math.Order, lhs: []const u8, rhs: []const u8) bool { return std.ascii.orderIgnoreCase(lhs, rhs) == d; } }.order);}
pub fn numbers(comptime T: type, values: []T, direction: Direction) void { switch (direction) { .asc => std.mem.sortUnstable(T, values, {}, std.sort.asc(T)), .desc => std.mem.sortUnstable(T, values, {}, std.sort.desc(T)), }}
const t = @import("zul.zig").testing;test "sort: string / ascii" { var values = [_][]const u8{ "ABC", "abc", "Dog", "Cat", "horse", "chicken" }; strings(&values, .asc); try t.expectEqual("ABC", values[0]); try t.expectEqual("Cat", values[1]); try t.expectEqual("Dog", values[2]); try t.expectEqual("abc", values[3]); try t.expectEqual("chicken", values[4]); try t.expectEqual("horse", values[5]);
strings(&values, .desc); try t.expectEqual("ABC", values[5]); try t.expectEqual("Cat", values[4]); try t.expectEqual("Dog", values[3]); try t.expectEqual("abc", values[2]); try t.expectEqual("chicken", values[1]); try t.expectEqual("horse", values[0]);
asciiIgnoreCase(&values, .asc); try t.expectEqual("abc", values[0]); try t.expectEqual("ABC", values[1]); try t.expectEqual("Cat", values[2]); try t.expectEqual("chicken", values[3]); try t.expectEqual("Dog", values[4]); try t.expectEqual("horse", values[5]);
asciiIgnoreCase(&values, .desc); try t.expectEqual("ABC", values[5]); try t.expectEqual("abc", values[4]); try t.expectEqual("Cat", values[3]); try t.expectEqual("chicken", values[2]); try t.expectEqual("Dog", values[1]); try t.expectEqual("horse", values[0]);}
test "sort: numbers" { var values = [_]i32{ 10, -20, 33, 0, 2, 6 }; numbers(i32, &values, .asc); try t.expectEqual(-20, values[0]); try t.expectEqual(0, values[1]); try t.expectEqual(2, values[2]); try t.expectEqual(6, values[3]); try t.expectEqual(10, values[4]); try t.expectEqual(33, values[5]);
numbers(i32, &values, .desc); try t.expectEqual(-20, values[5]); try t.expectEqual(0, values[4]); try t.expectEqual(2, values[3]); try t.expectEqual(6, values[2]); try t.expectEqual(10, values[1]); try t.expectEqual(33, values[0]);}