const std = @import("std");

const Frequency = 500;
const Mods = .{
    @import("Mem.zig"),
    @import("Cpu.zig"),
    @import("Time.zig"),
};

pub fn main() !void {
    var gpa = std.heap.GeneralPurposeAllocator(.{}){};
    defer _ = gpa.deinit();
    const alloc = gpa.allocator();

    var mods: std.meta.Tuple(&Mods) = undefined;
    inline for (&mods) |*mod| {
        try mod.init(alloc);
    }
    defer {
        inline for (&mods) |*mod| {
            mod.deinit(alloc);
        }
    }

    const stdout = std.io.getStdOut();
    const buffer = try alloc.alloc(u8, 512);
    defer alloc.free(buffer);

    var outputs: [Mods.len][]const u8 = undefined;

    while (true) {
        std.time.sleep(Frequency * std.time.ns_per_ms);

        inline for (&mods, &outputs) |*mod, *out| {
            out.* = try mod.update();
        }

        const output = try std.fmt.bufPrint(buffer, "{s}\n", .{outputs});
        try stdout.writeAll(output);
    }
}
