use std.process_bar;
use std.os;
use std.io;
use std.math;

var ppm = func(filename, width, height, RGB) {
    # P3 use ASCII number
    # P6 use binary character
    var fd = io.open(filename, "wb");
    io.write(fd, "P6\n"~width~" "~height~"\n255\n");
    for(var i = 0; i<height; i+=1) {
        for(var j = 0; j<width; j+=1) {
            io.write(fd, RGB(i, j));
        }
    }
    io.close(fd);
}

var width = 1920;
var height = 1080;
var bar = (os.platform()=="windows")?
    process_bar.bar(front:"sharp", back:"point", sep:"line", length:50):
    process_bar.high_resolution_bar(50);

var RGB = func(h, w) {
    var r = 2+w*2/width;
    var x = (height-h)/height;

    var res = 0;
    var tmp = 0.5;
    for(var i = 0; i<50; i+=1) {
        tmp = r*tmp*(1-tmp);
    }
    for(var i = 0; i<100; i+=1) {
        tmp = r*tmp*(1-tmp);
        if (math.abs(tmp-x)<0.001) {
            res = 255;
            break;
        }
    }

    var progress = (h*width+w+1)/(width*height);
    if (progress*100-int(progress*100)==0) {
        print(bar.bar(progress), " ", progress*100, "%          \r");
    }

    var c = char(res);
    return c~c~c;
}

ppm("feigenbaum.ppm", width, height, RGB);
println();