class EL_CONSOLE_PROGRESS_DISPLAY
Console file progress display
note
	description: "Console file progress display"
	author: "Finnian Reilly"
	copyright: "Copyright (c) 2001-2022 Finnian Reilly"
	contact: "finnian at eiffel hyphen loop dot com"
	license: "MIT license (See: en.wikipedia.org/wiki/MIT_License)"
	date: "2025-02-21 8:38:51 GMT (Friday 21st February 2025)"
	revision: "15"
		
		class
	EL_CONSOLE_PROGRESS_DISPLAY
inherit
	EL_PROGRESS_DISPLAY
	EL_MODULE_LIO
	EL_SHARED_FORMAT_FACTORY
create
	make
feature {NONE} -- Initialization
	make
		do
			create filled_space.make_filled (' ', Space_count)
		end
feature -- Element change
	set_identified_text (id: INTEGER; a_text: READABLE_STRING_GENERAL)
		do
			lio.put_line (a_text)
		end
feature {NONE} -- Event handling
	on_finish
		do
			set_progress (One)
			lio.put_new_line
			index := 0
			filled_space.wipe_out
			filled_space.fill_blank
		end
	on_start (tick_byte_count: INTEGER)
		do
			set_progress (0)
		end
feature -- Basic operations
	set_progress (a_proportion: DOUBLE)
		local
			count, old_index: INTEGER; c: CHARACTER; proportion: DOUBLE
			percentile: STRING
		do
			proportion := a_proportion.min (a_proportion.one)
			count := (Space_count * proportion).rounded
			old_index := index
			from until index > count loop
				if index > 0 then
					if index > 1 then
						filled_space.put ('=', index - 1)
					end
					if index = count then
						c := '>'
					else
						c := '='
					end
					filled_space.put (c, index)
				end
				index := index + 1
			end
			if index > old_index or else a_proportion = One then
				lio.put_character ('%R')
				percentile := Format.double_as_string (100 * proportion, once "999.9%%|")
				lio.put_substitution (Bar_template, [filled_space, percentile])
			end
		end
feature {NONE} -- Implementation
	filled_space: ZSTRING
	index: INTEGER
feature {NONE} -- Constants
	One: DOUBLE
		once
			Result := Result.one
		end
	Bar_template: ZSTRING
		once
			Result := "[%S] %S"
		end
	Space_count: INTEGER
		once
			Result := 100
		end
end