refactor: add unicode.case_folded_write

This commit is contained in:
CJ van den Berg 2025-11-25 21:42:51 +01:00
parent e35a0555f1
commit 37428bd698
Signed by: neurocyte
GPG key ID: 8EB1E1BB660E3FB9

View file

@ -113,9 +113,7 @@ pub const TransformError = error{
WriteFailed, WriteFailed,
}; };
fn utf8_transform(comptime field: uucode.FieldEnum, allocator: std.mem.Allocator, text: []const u8) TransformError![]u8 { fn utf8_write_transform(comptime field: uucode.FieldEnum, writer: *std.Io.Writer, text: []const u8) TransformError!void {
var result: std.Io.Writer.Allocating = .init(allocator);
defer result.deinit();
const view: std.unicode.Utf8View = try .init(text); const view: std.unicode.Utf8View = try .init(text);
var it = view.iterator(); var it = view.iterator();
while (it.nextCodepoint()) |cp| { while (it.nextCodepoint()) |cp| {
@ -126,8 +124,14 @@ fn utf8_transform(comptime field: uucode.FieldEnum, allocator: std.mem.Allocator
}; };
var utf8_buf: [6]u8 = undefined; var utf8_buf: [6]u8 = undefined;
const size = try std.unicode.utf8Encode(cp_, &utf8_buf); const size = try std.unicode.utf8Encode(cp_, &utf8_buf);
try result.writer.writeAll(utf8_buf[0..size]); try writer.writeAll(utf8_buf[0..size]);
} }
}
fn utf8_transform(comptime field: uucode.FieldEnum, allocator: std.mem.Allocator, text: []const u8) TransformError![]u8 {
var result: std.Io.Writer.Allocating = .init(allocator);
defer result.deinit();
try utf8_write_transform(field, &result.writer, text);
return result.toOwnedSlice(); return result.toOwnedSlice();
} }
@ -162,6 +166,10 @@ pub fn case_fold(allocator: std.mem.Allocator, text: []const u8) TransformError!
return utf8_transform(.case_folding_simple, allocator, text); return utf8_transform(.case_folding_simple, allocator, text);
} }
pub fn case_folded_write(writer: *std.Io.Writer, text: []const u8) TransformError!void {
return utf8_write_transform(.case_folding_simple, writer, text);
}
pub fn switch_case(allocator: std.mem.Allocator, text: []const u8) TransformError![]u8 { pub fn switch_case(allocator: std.mem.Allocator, text: []const u8) TransformError![]u8 {
return if (try utf8_predicate(.is_lowercase, text)) return if (try utf8_predicate(.is_lowercase, text))
to_upper(allocator, text) to_upper(allocator, text)