| ... | ... | @@ -2,9 +2,9 @@ const std = @import("std"); |
| 2 | 2 | const string = []const u8; |
| 3 | 3 | const extras = @import("./lib.zig"); |
| 4 | 4 | |
| 5 | | pub fn reduceNumber(alloc: std.mem.Allocator, input: u64, comptime unit: u64, comptime base: string, comptime prefixes: string) !string { |
| 5 | pub fn reduceNumber(writer: anytype, input: u64, comptime unit: u64, comptime base: string, comptime prefixes: string) !void { |
| 6 | 6 | if (input < unit) { |
| 7 | | return std.fmt.allocPrint(alloc, "{d} {s}", .{ input, base }); |
| 7 | return try writer.print("{d} {s}", .{ input, base }); |
| 8 | 8 | } |
| 9 | 9 | var div = unit; |
| 10 | 10 | var exp: usize = 0; |
| ... | ... | @@ -16,30 +16,34 @@ pub fn reduceNumber(alloc: std.mem.Allocator, input: u64, comptime unit: u64, co |
| 16 | 16 | } |
| 17 | 17 | const input_f: f64 = @floatFromInt(input); |
| 18 | 18 | const div_f: f64 = @floatFromInt(div); |
| 19 | | return try std.fmt.allocPrint(alloc, "{d:.3} {s}{s}", .{ input_f / div_f, prefixes[exp..][0..1], base }); |
| 19 | return try writer.print("{d:.3} {s}{s}", .{ input_f / div_f, prefixes[exp..][0..1], base }); |
| 20 | 20 | } |
| 21 | 21 | |
| 22 | 22 | test { |
| 23 | 23 | const allocator = std.testing.allocator; |
| 24 | | const actual = try reduceNumber(allocator, 1, 60, "s", "mh"); |
| 25 | | defer allocator.free(actual); |
| 26 | | try std.testing.expect(std.mem.eql(u8, actual, "1 s")); |
| 24 | var list = std.ArrayList(u8).init(allocator); |
| 25 | defer list.deinit(); |
| 26 | try reduceNumber(list.writer(), 1, 60, "s", "mh"); |
| 27 | try std.testing.expect(std.mem.eql(u8, list.items, "1 s")); |
| 27 | 28 | } |
| 28 | 29 | test { |
| 29 | 30 | const allocator = std.testing.allocator; |
| 30 | | const actual = try reduceNumber(allocator, 60, 60, "s", "mh"); |
| 31 | | defer allocator.free(actual); |
| 32 | | try std.testing.expect(std.mem.eql(u8, actual, "1.000 ms")); |
| 31 | var list = std.ArrayList(u8).init(allocator); |
| 32 | defer list.deinit(); |
| 33 | try reduceNumber(list.writer(), 60, 60, "s", "mh"); |
| 34 | try std.testing.expect(std.mem.eql(u8, list.items, "1.000 ms")); |
| 33 | 35 | } |
| 34 | 36 | test { |
| 35 | 37 | const allocator = std.testing.allocator; |
| 36 | | const actual = try reduceNumber(allocator, 3600, 60, "s", "mh"); |
| 37 | | defer allocator.free(actual); |
| 38 | | try std.testing.expect(std.mem.eql(u8, actual, "1.000 hs")); |
| 38 | var list = std.ArrayList(u8).init(allocator); |
| 39 | defer list.deinit(); |
| 40 | try reduceNumber(list.writer(), 3600, 60, "s", "mh"); |
| 41 | try std.testing.expect(std.mem.eql(u8, list.items, "1.000 hs")); |
| 39 | 42 | } |
| 40 | 43 | test { |
| 41 | 44 | const allocator = std.testing.allocator; |
| 42 | | const actual = try reduceNumber(allocator, 216000, 60, "s", "mh"); |
| 43 | | defer allocator.free(actual); |
| 44 | | try std.testing.expect(std.mem.eql(u8, actual, "60.000 hs")); |
| 45 | var list = std.ArrayList(u8).init(allocator); |
| 46 | defer list.deinit(); |
| 47 | try reduceNumber(list.writer(), 216000, 60, "s", "mh"); |
| 48 | try std.testing.expect(std.mem.eql(u8, list.items, "60.000 hs")); |
| 45 | 49 | } |