|
1 local ceil, floor = math.ceil, math.floor; |
|
2 local write = io.write; |
|
3 module("progress"); |
|
4 |
|
5 function new(total) |
|
6 total = total or 100; |
|
7 |
|
8 local anim = { '/', '-', '\\', '|' }; |
|
9 local anim_max, anim_frame = #anim, 0; |
|
10 |
|
11 local completed, percent_complete = 0, 0; |
|
12 local needs_update = true; |
|
13 |
|
14 local function update_data(self, new_completed) |
|
15 completed = new_completed; |
|
16 local new_percent_complete = floor(100/(total/completed)); |
|
17 if percent_complete ~= new_percent_complete then |
|
18 needs_update = true; |
|
19 end |
|
20 percent_complete = new_percent_complete; |
|
21 return needs_update; |
|
22 end |
|
23 |
|
24 local function update_progress_display() |
|
25 anim_frame = (anim_frame%anim_max) + 1; |
|
26 write("\n\027[K0% [", ("="):rep(floor(percent_complete/2)), percent_complete ~= 100 and ">" or "", (" "):rep((50-floor(percent_complete/2))-1), "] 100%"); |
|
27 write("\n\027[K", anim[anim_frame], " ", percent_complete, "% complete"); --; ETA ", ceil((now()-start_time)/(bytes_completed/bytes_total)/60), "min"); |
|
28 write("\027[3A\n"); |
|
29 end |
|
30 return { refresh = update_progress_display, update = update_data }; |
|
31 end |
|
32 |
|
33 return _M; |