const std = @import("std"); const Allocator = std.mem.Allocator; const ArrayList = std.ArrayList; const StringBuilder = @This(); pub const Error = std.mem.Allocator.Error; pub const Writer = std.io.Writer(*StringBuilder, Error, writeFn); data: ArrayList(u8), pub fn init(allocator: std.mem.Allocator) StringBuilder { return .{ .data = ArrayList(u8).init(allocator), }; } pub fn deinit(self: StringBuilder) void { self.data.deinit(); } pub fn append(self: *StringBuilder, char: u8) Error!void { return self.data.append(char); } pub fn appendMany(self: *StringBuilder, chars: []const u8) Error!void { return self.data.appendSlice(chars); } pub fn seeSlice(self: *StringBuilder) []const u8 { return self.data.items; } pub fn toOwnedSlice(self: StringBuilder) []u8 { return self.data.toOwnedSlice(); } pub fn writer(self: *StringBuilder) Writer { return Writer{ .context = self }; } fn writeFn(self: *StringBuilder, chars: []const u8) Error!usize { try self.appendMany(chars); return chars.len; }