Fri, 21 May 2010 12:56:15 +0100
Reset needs_update flag on refresh
local ceil, floor = math.ceil, math.floor; local write = io.write; module("progress"); function new(total) total = total or 100; local anim = { '/', '-', '\\', '|' }; local anim_max, anim_frame = #anim, 0; local completed, percent_complete = 0, 0; local needs_update = true; local function update_data(self, new_completed) completed = new_completed; local new_percent_complete = floor(100/(total/completed)); if percent_complete ~= new_percent_complete then needs_update = true; end percent_complete = new_percent_complete; return needs_update; end local function update_progress_display() anim_frame = (anim_frame%anim_max) + 1; write("\n\027[K0% [", ("="):rep(floor(percent_complete/2)), percent_complete ~= 100 and ">" or "", (" "):rep((50-floor(percent_complete/2))-1), "] 100%"); write("\n\027[K", anim[anim_frame], " ", percent_complete, "% complete"); --; ETA ", ceil((now()-start_time)/(bytes_completed/bytes_total)/60), "min"); write("\027[3A\n"); needs_update = false; end return { refresh = update_progress_display, update = update_data }; end return _M;