-module(glitzer@progress). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -define(FILEPATH, "src/glitzer/progress.gleam"). -export([char_from_string/1, string_from_char/1, default_bar/0, slim_bar/0, fancy_slim_bar/0, fancy_slim_arrow_bar/0, thick_bar/0, fancy_thick_bar/0, new_bar/0, with_left_text/2, with_right_text/2, with_empty/2, with_fill/2, with_fill_finished/2, with_fill_head/2, with_fill_head_finished/2, with_newline_on_finished/2, with_length/2, tick/1, tick_by/2, finish/1, print_bar/1, get_raw_bar/1, map_yielder/3, map2_yielder/4, each_yielder/3]). -export_type([char_/0, state/0, progress_style/0]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. -opaque char_() :: {char, binary()}. -opaque state() :: {state, integer(), boolean()}. -opaque progress_style() :: {progress_style, binary(), binary(), char_(), char_(), gleam@option:option(char_()), gleam@option:option(char_()), gleam@option:option(char_()), boolean(), integer(), state()}. -file("src/glitzer/progress.gleam", 80). ?DOC( " Create a `Char` from a `String`. Returns a `Char` with the given string if\n" " the strings length is equal to one and a `Char` of \"#\" otherwise.\n" "\n" "
\n" " Example:\n" "\n" " ```gleam\n" " import glitzer/progress\n" "\n" " fn example() {\n" " let char = progress.char_from_string(\"A\")\n" " }\n" " ```\n" "\n" "
\n" ). -spec char_from_string(binary()) -> char_(). char_from_string(In) -> Len = string:length(In), case Len of 1 -> {char, In}; _ -> {char, <<"#"/utf8>>} end. -file("src/glitzer/progress.gleam", 90). ?DOC(" Create a `String` from a given `Char`.\n"). -spec string_from_char(char_()) -> binary(). string_from_char(In) -> erlang:element(2, In). -file("src/glitzer/progress.gleam", 117). ?DOC(" Create and return a default progress bar.\n"). -spec default_bar() -> progress_style(). default_bar() -> {progress_style, <<"["/utf8>>, <<"]"/utf8>>, {char, <<" "/utf8>>}, {char, <<"#"/utf8>>}, none, none, none, true, 100, {state, 0, false}}. -file("src/glitzer/progress.gleam", 133). ?DOC(" Create and return a fancy and slim progress bar (inspired by pip).\n"). -spec slim_bar() -> progress_style(). slim_bar() -> Sym = <<"\x{2014}"/utf8>>, {progress_style, <<""/utf8>>, <<""/utf8>>, {char, <<" "/utf8>>}, {char, Sym}, none, none, none, true, 100, {state, 0, false}}. -file("src/glitzer/progress.gleam", 150). ?DOC(" Create and return a fancy and slim progress bar (inspired by pip).\n"). -spec fancy_slim_bar() -> progress_style(). fancy_slim_bar() -> Sym = <<"\x{2014}"/utf8>>, {progress_style, <<""/utf8>>, <<""/utf8>>, {char, gleam_community@ansi:blue(Sym)}, {char, gleam_community@ansi:red(Sym)}, {some, {char, gleam_community@ansi:green(Sym)}}, none, none, true, 100, {state, 0, false}}. -file("src/glitzer/progress.gleam", 167). ?DOC(" Create and return a fancy and slim progress bar with an arrow head.\n"). -spec fancy_slim_arrow_bar() -> progress_style(). fancy_slim_arrow_bar() -> Sym = <<"\x{2014}"/utf8>>, Sym_head = <<"\x{2192}"/utf8>>, {progress_style, <<""/utf8>>, <<""/utf8>>, {char, gleam_community@ansi:blue(Sym)}, {char, gleam_community@ansi:red(Sym)}, {some, {char, gleam_community@ansi:green(Sym)}}, {some, {char, gleam_community@ansi:red(Sym_head)}}, {some, {char, gleam_community@ansi:green(Sym_head)}}, true, 100, {state, 0, false}}. -file("src/glitzer/progress.gleam", 185). ?DOC(" Create and return a thick bar.\n"). -spec thick_bar() -> progress_style(). thick_bar() -> Sym = <<"\x{2588}"/utf8>>, Empty_sym = <<"\x{2592}"/utf8>>, {progress_style, <<""/utf8>>, <<""/utf8>>, {char, Empty_sym}, {char, Sym}, none, none, none, true, 100, {state, 0, false}}. -file("src/glitzer/progress.gleam", 203). ?DOC(" Create and return a fancy thick bar.\n"). -spec fancy_thick_bar() -> progress_style(). fancy_thick_bar() -> Sym = <<"\x{2588}"/utf8>>, Empty_sym = <<"\x{2592}"/utf8>>, {progress_style, <<""/utf8>>, <<""/utf8>>, {char, gleam_community@ansi:blue(Empty_sym)}, {char, gleam_community@ansi:red(Sym)}, {some, {char, gleam_community@ansi:green(Sym)}}, none, none, true, 100, {state, 0, false}}. -file("src/glitzer/progress.gleam", 240). ?DOC( " Create a new (completely empty) progress bar.\n" "\n" "
\n" " Example:\n" "\n" " ```gleam\n" " import glitzer/progress\n" "\n" " fn example() {\n" " let bar = \n" " progress.new_bar()\n" " |> progress.with_length(50)\n" " |> progress.with_left_text(\"Progress: \")\n" " |> progress.with_fill(progress.char_from_string(\"+\"))\n" " }\n" " ```\n" "\n" "
\n" ). -spec new_bar() -> progress_style(). new_bar() -> {progress_style, <<""/utf8>>, <<""/utf8>>, {char, <<" "/utf8>>}, {char, <<" "/utf8>>}, none, none, none, true, 0, {state, 0, false}}. -file("src/glitzer/progress.gleam", 256). ?DOC(" Add left text to a progress bar.\n"). -spec with_left_text(progress_style(), binary()) -> progress_style(). with_left_text(Bar, Text) -> _record = Bar, {progress_style, Text, erlang:element(3, _record), erlang:element(4, _record), erlang:element(5, _record), erlang:element(6, _record), erlang:element(7, _record), erlang:element(8, _record), erlang:element(9, _record), erlang:element(10, _record), erlang:element(11, _record)}. -file("src/glitzer/progress.gleam", 264). ?DOC(" Add right text to a progress bar.\n"). -spec with_right_text(progress_style(), binary()) -> progress_style(). with_right_text(Bar, Text) -> _record = Bar, {progress_style, erlang:element(2, _record), Text, erlang:element(4, _record), erlang:element(5, _record), erlang:element(6, _record), erlang:element(7, _record), erlang:element(8, _record), erlang:element(9, _record), erlang:element(10, _record), erlang:element(11, _record)}. -file("src/glitzer/progress.gleam", 273). ?DOC( " Add a character to a progress bar that is used to represent the\n" " \"background\" of the bar.\n" ). -spec with_empty(progress_style(), char_()) -> progress_style(). with_empty(Bar, Char) -> _record = Bar, {progress_style, erlang:element(2, _record), erlang:element(3, _record), Char, erlang:element(5, _record), erlang:element(6, _record), erlang:element(7, _record), erlang:element(8, _record), erlang:element(9, _record), erlang:element(10, _record), erlang:element(11, _record)}. -file("src/glitzer/progress.gleam", 279). ?DOC( " Add a character to a progress bar that is used to fill the bar on each\n" " tick.\n" ). -spec with_fill(progress_style(), char_()) -> progress_style(). with_fill(Bar, Char) -> _record = Bar, {progress_style, erlang:element(2, _record), erlang:element(3, _record), erlang:element(4, _record), Char, erlang:element(6, _record), erlang:element(7, _record), erlang:element(8, _record), erlang:element(9, _record), erlang:element(10, _record), erlang:element(11, _record)}. -file("src/glitzer/progress.gleam", 284). ?DOC(" Add a character that will be used instead of `fill` if the bar is finished.\n"). -spec with_fill_finished(progress_style(), char_()) -> progress_style(). with_fill_finished(Bar, Char) -> _record = Bar, {progress_style, erlang:element(2, _record), erlang:element(3, _record), erlang:element(4, _record), erlang:element(5, _record), {some, Char}, erlang:element(7, _record), erlang:element(8, _record), erlang:element(9, _record), erlang:element(10, _record), erlang:element(11, _record)}. -file("src/glitzer/progress.gleam", 292). ?DOC(" Add a head to the progress bar.\n"). -spec with_fill_head(progress_style(), char_()) -> progress_style(). with_fill_head(Bar, Char) -> _record = Bar, {progress_style, erlang:element(2, _record), erlang:element(3, _record), erlang:element(4, _record), erlang:element(5, _record), erlang:element(6, _record), {some, Char}, erlang:element(8, _record), erlang:element(9, _record), erlang:element(10, _record), erlang:element(11, _record)}. -file("src/glitzer/progress.gleam", 298). ?DOC( " Add a head to the progress bar that will be displayed when the bar\n" " finishes.\n" ). -spec with_fill_head_finished(progress_style(), char_()) -> progress_style(). with_fill_head_finished(Bar, Char) -> _record = Bar, {progress_style, erlang:element(2, _record), erlang:element(3, _record), erlang:element(4, _record), erlang:element(5, _record), erlang:element(6, _record), erlang:element(7, _record), {some, Char}, erlang:element(9, _record), erlang:element(10, _record), erlang:element(11, _record)}. -file("src/glitzer/progress.gleam", 305). -spec with_newline_on_finished(progress_style(), boolean()) -> progress_style(). with_newline_on_finished(Bar, N) -> _record = Bar, {progress_style, erlang:element(2, _record), erlang:element(3, _record), erlang:element(4, _record), erlang:element(5, _record), erlang:element(6, _record), erlang:element(7, _record), erlang:element(8, _record), N, erlang:element(10, _record), erlang:element(11, _record)}. -file("src/glitzer/progress.gleam", 313). ?DOC(" Add length to a progress bar.\n"). -spec with_length(progress_style(), integer()) -> progress_style(). with_length(Bar, Len) -> _record = Bar, {progress_style, erlang:element(2, _record), erlang:element(3, _record), erlang:element(4, _record), erlang:element(5, _record), erlang:element(6, _record), erlang:element(7, _record), erlang:element(8, _record), erlang:element(9, _record), Len, erlang:element(11, _record)}. -file("src/glitzer/progress.gleam", 318). ?DOC(" Increase the progress of the bar by one.\n"). -spec tick(progress_style()) -> progress_style(). tick(Bar) -> case erlang:element(2, erlang:element(11, Bar)) < (erlang:element(10, Bar) + 1) of true -> _record = Bar, {progress_style, erlang:element(2, _record), erlang:element(3, _record), erlang:element(4, _record), erlang:element(5, _record), erlang:element(6, _record), erlang:element(7, _record), erlang:element(8, _record), erlang:element(9, _record), erlang:element(10, _record), begin _record@1 = erlang:element(11, Bar), {state, erlang:element(2, erlang:element(11, Bar)) + 1, erlang:element(3, _record@1)} end}; false -> _record@2 = Bar, {progress_style, erlang:element(2, _record@2), erlang:element(3, _record@2), erlang:element(4, _record@2), erlang:element(5, _record@2), erlang:element(6, _record@2), erlang:element(7, _record@2), erlang:element(8, _record@2), erlang:element(9, _record@2), erlang:element(10, _record@2), {state, erlang:element(2, erlang:element(11, Bar)) + 1, true}} end. -file("src/glitzer/progress.gleam", 334). ?DOC(" Increase the progress of the bar by `i`.\n"). -spec tick_by(progress_style(), integer()) -> progress_style(). tick_by(Bar, I) -> case I > 0 of true -> Bar@1 = tick(Bar), tick_by(Bar@1, I - 1); false -> Bar end. -file("src/glitzer/progress.gleam", 345). ?DOC(" Completely fill the progress bar.\n"). -spec finish(progress_style()) -> progress_style(). finish(Bar) -> _record = Bar, {progress_style, erlang:element(2, _record), erlang:element(3, _record), erlang:element(4, _record), erlang:element(5, _record), erlang:element(6, _record), erlang:element(7, _record), erlang:element(8, _record), erlang:element(9, _record), erlang:element(10, _record), {state, erlang:element(10, Bar) + 1, true}}. -file("src/glitzer/progress.gleam", 444). -spec get_finished_head_fill(gleam@string_tree:string_tree(), progress_style()) -> gleam@string_tree:string_tree(). get_finished_head_fill(Fill, Bar) -> case erlang:element(3, erlang:element(11, Bar)) of true -> gleam@string_tree:append( Fill, erlang:element( 2, gleam@option:unwrap( erlang:element(8, Bar), gleam@option:unwrap( erlang:element(7, Bar), gleam@option:unwrap( erlang:element(6, Bar), erlang:element(5, Bar) ) ) ) ) ); false -> gleam@string_tree:append( Fill, erlang:element( 2, gleam@option:unwrap( erlang:element(7, Bar), erlang:element(5, Bar) ) ) ) end. -file("src/glitzer/progress.gleam", 467). -spec get_finished_fill(gleam@string_tree:string_tree(), progress_style()) -> gleam@string_tree:string_tree(). get_finished_fill(Fill, Bar) -> case erlang:element(3, erlang:element(11, Bar)) of true -> gleam@string_tree:append( Fill, erlang:element( 2, gleam@option:unwrap( erlang:element(6, Bar), erlang:element(5, Bar) ) ) ); false -> gleam@string_tree:append( Fill, erlang:element(2, erlang:element(5, Bar)) ) end. -file("src/glitzer/progress.gleam", 421). -spec build_progress_fill( gleam@string_tree:string_tree(), progress_style(), integer(), integer() ) -> gleam@string_tree:string_tree(). build_progress_fill(Fill, Bar, Left_nonempty, Count) -> Fill@1 = case Left_nonempty > 0 of true -> case Left_nonempty =:= 1 of true -> get_finished_head_fill(Fill, Bar); false -> get_finished_fill(Fill, Bar) end; false -> gleam@string_tree:append( Fill, erlang:element(2, erlang:element(4, Bar)) ) end, case erlang:element(10, Bar) > Count of true -> build_progress_fill(Fill@1, Bar, Left_nonempty - 1, Count + 1); false -> Fill@1 end. -file("src/glitzer/progress.gleam", 377). ?DOC( " Print the progress bar to stderr.\n" "\n" "
\n" " Example:\n" "\n" " ```gleam\n" " import glitzer/progress\n" "\n" " fn example() {\n" " let bar = progress.default_bar()\n" "\n" " run_example(bar, 0)\n" " }\n" "\n" " fn run_example(bar, count) {\n" " case count < 100 {\n" " True -> {\n" " let bar = progress.tick(bar)\n" " // do some awesome stuff :3\n" " progress.print_bar(bar)\n" " run_example(bar, count + 1)\n" " }\n" " False -> Nil\n" " }\n" " }\n" " ```\n" "\n" "
\n" ). -spec print_bar(progress_style()) -> nil. print_bar(Bar) -> Bar@1 = begin _record = Bar, {progress_style, erlang:element(2, _record), erlang:element(3, _record), erlang:element(4, _record), erlang:element(5, _record), erlang:element(6, _record), erlang:element(7, _record), erlang:element(8, _record), erlang:element(9, _record), erlang:element(10, _record), begin _record@1 = erlang:element(11, Bar), {state, erlang:element(2, _record@1), erlang:element(2, erlang:element(11, Bar)) >= erlang:element( 10, Bar )} end} end, Fill = begin _pipe = build_progress_fill( gleam@string_tree:new(), Bar@1, erlang:element(2, erlang:element(11, Bar@1)) + 1, 0 ), unicode:characters_to_binary(_pipe) end, End = case erlang:element(3, erlang:element(11, Bar@1)) of true -> <<"\n"/utf8, (<<"\x{001b}[?25h"/utf8>>)/binary>>; false -> <<""/utf8>> end, gleam_stdlib:print_error( <<<<<<<<<<<<(<<"\x{001b}[?25l"/utf8>>)/binary, (<<"\x{001b}[2K"/utf8>>)/binary>>/binary, (<<"\r"/utf8>>)/binary>>/binary, (erlang:element(2, Bar@1))/binary>>/binary, Fill/binary>>/binary, (erlang:element(3, Bar@1))/binary>>/binary, End/binary>> ). -file("src/glitzer/progress.gleam", 403). -spec get_raw_bar(progress_style()) -> binary(). get_raw_bar(Bar) -> Bar@1 = begin _record = Bar, {progress_style, erlang:element(2, _record), erlang:element(3, _record), erlang:element(4, _record), erlang:element(5, _record), erlang:element(6, _record), erlang:element(7, _record), erlang:element(8, _record), erlang:element(9, _record), erlang:element(10, _record), begin _record@1 = erlang:element(11, Bar), {state, erlang:element(2, _record@1), erlang:element(2, erlang:element(11, Bar)) >= erlang:element( 10, Bar )} end} end, Fill = begin _pipe = build_progress_fill( gleam@string_tree:new(), Bar@1, erlang:element(2, erlang:element(11, Bar@1)) + 1, 0 ), unicode:characters_to_binary(_pipe) end, End = case erlang:element(3, erlang:element(11, Bar@1)) andalso erlang:element( 9, Bar@1 ) of true -> <<"\n"/utf8>>; false -> <<""/utf8>> end, <<<<<<(erlang:element(2, Bar@1))/binary, Fill/binary>>/binary, (erlang:element(3, Bar@1))/binary>>/binary, End/binary>>. -file("src/glitzer/progress.gleam", 509). -spec tick_bar_by_i(progress_style(), integer()) -> progress_style(). tick_bar_by_i(Bar, I) -> case I > 0 of true -> tick_bar_by_i(tick(Bar), I - 1); false -> Bar end. -file("src/glitzer/progress.gleam", 496). ?DOC( " Map a yielder to a function with a bar that ticks every run of the\n" " function.\n" "\n" "
\n" " Example:\n" "\n" " ```gleam\n" " import glitzer/progress\n" "\n" " fn example(bar) {\n" " yielder.range(0, 100)\n" " |> progress.map_yielder(fn(bar, element) {\n" " progress.print_bar(bar)\n" " // do some heavy calculations here >:)\n" " })\n" " }\n" " ```\n" "\n" "
\n" ). -spec map_yielder( gleam@yielder:yielder(LVV), progress_style(), fun((progress_style(), LVV) -> LVX) ) -> gleam@yielder:yielder(LVX). map_yielder(Y, Bar, Fun) -> _pipe = gleam@yielder:index(Y), gleam@yielder:map( _pipe, fun(Pair) -> {El, I} = Pair, _pipe@1 = tick_bar_by_i(Bar, I), Fun(_pipe@1, El) end ). -file("src/glitzer/progress.gleam", 516). -spec map2_yielder( gleam@yielder:yielder(LWB), gleam@yielder:yielder(LWD), progress_style(), fun((progress_style(), LWB, LWD) -> LWF) ) -> gleam@yielder:yielder(LWF). map2_yielder(Y1, Y2, Bar, Fun) -> _pipe = gleam@yielder:zip(Y1, Y2), _pipe@1 = gleam@yielder:index(_pipe), gleam@yielder:map( _pipe@1, fun(Pair) -> {Pair@1, I} = Pair, {El1, El2} = Pair@1, _pipe@2 = tick_bar_by_i(Bar, I), Fun(_pipe@2, El1, El2) end ). -file("src/glitzer/progress.gleam", 532). -spec each_yielder( gleam@yielder:yielder(LWH), progress_style(), fun((progress_style(), LWH) -> any()) ) -> nil. each_yielder(Y, Bar, Fun) -> _pipe = gleam@yielder:index(Y), gleam@yielder:each( _pipe, fun(Pair) -> {El, I} = Pair, _pipe@1 = tick_bar_by_i(Bar, I), Fun(_pipe@1, El) end ).