-module(oaspec@internal@progress). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/oaspec/internal/progress.gleam"). -export([noop/0, from_fn/1, report/2, timed/1, format_ms/1, stdout_with_elapsed/0]). -export_type([reporter/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. ?MODULEDOC(false). -opaque reporter() :: {reporter, fun((binary()) -> nil)}. -file("src/oaspec/internal/progress.gleam", 29). ?DOC(false). -spec noop() -> reporter(). noop() -> {reporter, fun(_) -> nil end}. -file("src/oaspec/internal/progress.gleam", 36). ?DOC(false). -spec from_fn(fun((binary()) -> nil)) -> reporter(). from_fn(Emit) -> {reporter, Emit}. -file("src/oaspec/internal/progress.gleam", 41). ?DOC(false). -spec report(reporter(), binary()) -> nil. report(Reporter, Message) -> (erlang:element(2, Reporter))(Message). -file("src/oaspec/internal/progress.gleam", 48). ?DOC(false). -spec timed(fun(() -> RQI)) -> {integer(), RQI}. timed(Body) -> Start = oaspec_ffi:monotonic_ms(), Result = Body(), End = oaspec_ffi:monotonic_ms(), {End - Start, Result}. -file("src/oaspec/internal/progress.gleam", 58). ?DOC(false). -spec format_ms(integer()) -> binary(). format_ms(Ms) -> case Ms < 1000 of true -> <<(erlang:integer_to_binary(Ms))/binary, "ms"/utf8>>; false -> Total_seconds = Ms div 1000, Tenths = (Ms - (Total_seconds * 1000)) div 100, case Total_seconds >= 60 of true -> Minutes = Total_seconds div 60, Seconds = Total_seconds - (Minutes * 60), <<<<<<<<<<(erlang:integer_to_binary(Minutes))/binary, "m"/utf8>>/binary, (erlang:integer_to_binary(Seconds))/binary>>/binary, "."/utf8>>/binary, (erlang:integer_to_binary(Tenths))/binary>>/binary, "s"/utf8>>; false -> <<<<<<(erlang:integer_to_binary(Total_seconds))/binary, "."/utf8>>/binary, (erlang:integer_to_binary(Tenths))/binary>>/binary, "s"/utf8>> end end. -file("src/oaspec/internal/progress.gleam", 95). ?DOC(false). -spec pad_left(binary(), integer()) -> binary(). pad_left(Value, Width) -> Len = string:length(Value), case Len >= Width of true -> Value; false -> <<(gleam@string:repeat(<<" "/utf8>>, Width - Len))/binary, Value/binary>> end. -file("src/oaspec/internal/progress.gleam", 87). ?DOC(false). -spec stdout_with_elapsed() -> reporter(). stdout_with_elapsed() -> Started_at = oaspec_ffi:monotonic_ms(), from_fn( fun(Message) -> Elapsed = oaspec_ffi:monotonic_ms() - Started_at, gleam_stdlib:println( <<<<<<"[+"/utf8, (pad_left(format_ms(Elapsed), 7))/binary>>/binary, "] "/utf8>>/binary, Message/binary>> ) end ).