diff options
author | J.J <thechairman@thechairman.info> | 2024-05-30 21:50:02 -0400 |
---|---|---|
committer | J.J <thechairman@thechairman.info> | 2024-05-30 21:50:02 -0400 |
commit | 612fd986ab1e00b6d34dc1937136250e08e89325 (patch) | |
tree | a3c93952040c6afdf348b5831619a45db7ba0a2e /aoc2023/build/dev/erlang/gleam_community_ansi | |
parent | 231c2b688d1e6cf0846d46e883da30e042a9c6cf (diff) | |
download | gleam_aoc-612fd986ab1e00b6d34dc1937136250e08e89325.tar.gz gleam_aoc-612fd986ab1e00b6d34dc1937136250e08e89325.zip |
cleanup
Diffstat (limited to 'aoc2023/build/dev/erlang/gleam_community_ansi')
6 files changed, 428 insertions, 0 deletions
diff --git a/aoc2023/build/dev/erlang/gleam_community_ansi/_gleam_artefacts/gleam@@compile.erl b/aoc2023/build/dev/erlang/gleam_community_ansi/_gleam_artefacts/gleam@@compile.erl new file mode 100644 index 0000000..543db88 --- /dev/null +++ b/aoc2023/build/dev/erlang/gleam_community_ansi/_gleam_artefacts/gleam@@compile.erl @@ -0,0 +1,157 @@ +#!/usr/bin/env escript + +% TODO: Don't concurrently print warnings and errors +% TODO: Some tests + +-record(arguments, {lib = "./", out = "./", modules = []}). + +main(Args) -> + #arguments{out = Out, lib = Lib, modules = Modules} = parse(Args), + IsElixirModule = fun(Module) -> + filename:extension(Module) =:= ".ex" + end, + {ElixirModules, ErlangModules} = lists:partition(IsElixirModule, Modules), + ok = configure_logging(), + ok = add_lib_to_erlang_path(Lib), + ok = filelib:ensure_dir([Out, $/]), + {ErlangOk, _ErlangBeams} = compile_erlang(ErlangModules, Out), + {ElixirOk, _ElixirBeams} = case ErlangOk of + true -> compile_elixir(ElixirModules, Out); + false -> {false, []} + end, + case ErlangOk and ElixirOk of + true -> ok; + false -> erlang:halt(1) + end. + +compile_erlang(Modules, Out) -> + Workers = start_compiler_workers(Out), + ok = producer_loop(Modules, Workers), + collect_results({true, []}). + +collect_results(Acc = {Result, Beams}) -> + receive + {compiled, Beam} -> collect_results({Result, [Beam | Beams]}); + failed -> collect_results({false, Beams}) + after 0 -> Acc + end. + +producer_loop([], 0) -> + ok; +producer_loop([], Workers) -> + receive + {work_please, _} -> producer_loop([], Workers - 1) + end; +producer_loop([Module | Modules], Workers) -> + receive + {work_please, Worker} -> + erlang:send(Worker, {module, Module}), + producer_loop(Modules, Workers) + end. + +start_compiler_workers(Out) -> + Parent = self(), + NumSchedulers = erlang:system_info(schedulers), + SpawnWorker = fun(_) -> + erlang:spawn_link(fun() -> worker_loop(Parent, Out) end) + end, + lists:foreach(SpawnWorker, lists:seq(1, NumSchedulers)), + NumSchedulers. + +worker_loop(Parent, Out) -> + Options = [report_errors, report_warnings, debug_info, {outdir, Out}], + erlang:send(Parent, {work_please, self()}), + receive + {module, Module} -> + log({compiling, Module}), + case compile:file(Module, Options) of + {ok, ModuleName} -> + Beam = filename:join(Out, ModuleName) ++ ".beam", + Message = {compiled, Beam}, + log(Message), + erlang:send(Parent, Message); + error -> + log({failed, Module}), + erlang:send(Parent, failed) + end, + worker_loop(Parent, Out) + end. + +compile_elixir(Modules, Out) -> + Error = [ + "The program elixir was not found. Is it installed?", + $\n, + "Documentation for installing Elixir can be viewed here:", + $\n, + "https://elixir-lang.org/install.html" + ], + case Modules of + [] -> {true, []}; + _ -> + log({starting, "compiler.app"}), + ok = application:start(compiler), + log({starting, "elixir.app"}), + case application:start(elixir) of + ok -> do_compile_elixir(Modules, Out); + _ -> + io:put_chars(standard_error, [Error, $\n]), + {false, []} + end + end. + +do_compile_elixir(Modules, Out) -> + ModuleBins = lists:map(fun(Module) -> + log({compiling, Module}), + list_to_binary(Module) + end, Modules), + OutBin = list_to_binary(Out), + Options = [{dest, OutBin}], + % Silence "redefining module" warnings. + % Compiled modules in the build directory are added to the code path. + % These warnings result from recompiling loaded modules. + % TODO: This line can likely be removed if/when the build directory is cleaned before every compilation. + 'Elixir.Code':compiler_options([{ignore_module_conflict, true}]), + case 'Elixir.Kernel.ParallelCompiler':compile_to_path(ModuleBins, OutBin, Options) of + {ok, ModuleAtoms, _} -> + ToBeam = fun(ModuleAtom) -> + Beam = filename:join(Out, atom_to_list(ModuleAtom)) ++ ".beam", + log({compiled, Beam}), + Beam + end, + {true, lists:map(ToBeam, ModuleAtoms)}; + {error, Errors, _} -> + % Log all filenames associated with modules that failed to compile. + % Note: The compiler prints compilation errors upon encountering them. + ErrorFiles = lists:usort([File || {File, _, _} <- Errors]), + Log = fun(File) -> + log({failed, binary_to_list(File)}) + end, + lists:foreach(Log, ErrorFiles), + {false, []}; + _ -> {false, []} + end. + +add_lib_to_erlang_path(Lib) -> + code:add_paths(filelib:wildcard([Lib, "/*/ebin"])). + +parse(Args) -> + parse(Args, #arguments{}). + +parse([], Arguments) -> + Arguments; +parse(["--lib", Lib | Rest], Arguments) -> + parse(Rest, Arguments#arguments{lib = Lib}); +parse(["--out", Out | Rest], Arguments) -> + parse(Rest, Arguments#arguments{out = Out}); +parse([Module | Rest], Arguments = #arguments{modules = Modules}) -> + parse(Rest, Arguments#arguments{modules = [Module | Modules]}). + +configure_logging() -> + Enabled = os:getenv("GLEAM_LOG") /= false, + persistent_term:put(gleam_logging_enabled, Enabled). + +log(Term) -> + case persistent_term:get(gleam_logging_enabled) of + true -> erlang:display(Term), ok; + false -> ok + end. diff --git a/aoc2023/build/dev/erlang/gleam_community_ansi/_gleam_artefacts/gleam_community@ansi.cache b/aoc2023/build/dev/erlang/gleam_community_ansi/_gleam_artefacts/gleam_community@ansi.cache Binary files differnew file mode 100644 index 0000000..1f67bd7 --- /dev/null +++ b/aoc2023/build/dev/erlang/gleam_community_ansi/_gleam_artefacts/gleam_community@ansi.cache diff --git a/aoc2023/build/dev/erlang/gleam_community_ansi/_gleam_artefacts/gleam_community@ansi.cache_meta b/aoc2023/build/dev/erlang/gleam_community_ansi/_gleam_artefacts/gleam_community@ansi.cache_meta Binary files differnew file mode 100644 index 0000000..a01f4e8 --- /dev/null +++ b/aoc2023/build/dev/erlang/gleam_community_ansi/_gleam_artefacts/gleam_community@ansi.cache_meta diff --git a/aoc2023/build/dev/erlang/gleam_community_ansi/_gleam_artefacts/gleam_community@ansi.erl b/aoc2023/build/dev/erlang/gleam_community_ansi/_gleam_artefacts/gleam_community@ansi.erl new file mode 100644 index 0000000..1698e1e --- /dev/null +++ b/aoc2023/build/dev/erlang/gleam_community_ansi/_gleam_artefacts/gleam_community@ansi.erl @@ -0,0 +1,263 @@ +-module(gleam_community@ansi). +-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). + +-export([reset/1, bold/1, dim/1, italic/1, underline/1, inverse/1, hidden/1, strikethrough/1, black/1, red/1, green/1, yellow/1, blue/1, magenta/1, cyan/1, white/1, bright_black/1, grey/1, gray/1, bright_red/1, bright_green/1, bright_yellow/1, bright_blue/1, bright_magenta/1, bright_cyan/1, bright_white/1, hex/2, pink/1, colour/2, color/2, bg_black/1, bg_red/1, bg_green/1, bg_yellow/1, bg_blue/1, bg_magenta/1, bg_cyan/1, bg_white/1, bg_bright_black/1, bg_bright_red/1, bg_bright_green/1, bg_bright_yellow/1, bg_bright_blue/1, bg_bright_magenta/1, bg_bright_cyan/1, bg_bright_white/1, bg_hex/2, bg_pink/1, bg_colour/2, bg_color/2]). +-export_type([code/0]). + +-type code() :: {code, binary(), binary(), binary()}. + +-spec run(binary(), code()) -> binary(). +run(Text, Code) -> + <<<<(erlang:element(2, Code))/binary, + (gleam@string:replace( + Text, + erlang:element(4, Code), + erlang:element(2, Code) + ))/binary>>/binary, + (erlang:element(3, Code))/binary>>. + +-spec code(list(integer()), integer()) -> code(). +code(Open, Close) -> + Close_str = gleam@int:to_string(Close), + Open_strs = gleam@list:map(Open, fun gleam@int:to_string/1), + {code, + <<<<<<""/utf8, "["/utf8>>/binary, + (gleam@string:join(Open_strs, <<";"/utf8>>))/binary>>/binary, + "m"/utf8>>, + <<<<<<""/utf8, "["/utf8>>/binary, Close_str/binary>>/binary, "m"/utf8>>, + <<<<<<""/utf8, "["/utf8>>/binary, Close_str/binary>>/binary, "m"/utf8>>}. + +-spec reset(binary()) -> binary(). +reset(Text) -> + run(Text, code([0], 0)). + +-spec bold(binary()) -> binary(). +bold(Text) -> + run(Text, code([1], 22)). + +-spec dim(binary()) -> binary(). +dim(Text) -> + run(Text, code([2], 22)). + +-spec italic(binary()) -> binary(). +italic(Text) -> + run(Text, code([3], 23)). + +-spec underline(binary()) -> binary(). +underline(Text) -> + run(Text, code([4], 24)). + +-spec inverse(binary()) -> binary(). +inverse(Text) -> + run(Text, code([7], 27)). + +-spec hidden(binary()) -> binary(). +hidden(Text) -> + run(Text, code([8], 28)). + +-spec strikethrough(binary()) -> binary(). +strikethrough(Text) -> + run(Text, code([9], 29)). + +-spec black(binary()) -> binary(). +black(Text) -> + run(Text, code([30], 39)). + +-spec red(binary()) -> binary(). +red(Text) -> + run(Text, code([31], 39)). + +-spec green(binary()) -> binary(). +green(Text) -> + run(Text, code([32], 39)). + +-spec yellow(binary()) -> binary(). +yellow(Text) -> + run(Text, code([33], 39)). + +-spec blue(binary()) -> binary(). +blue(Text) -> + run(Text, code([34], 39)). + +-spec magenta(binary()) -> binary(). +magenta(Text) -> + run(Text, code([35], 39)). + +-spec cyan(binary()) -> binary(). +cyan(Text) -> + run(Text, code([36], 39)). + +-spec white(binary()) -> binary(). +white(Text) -> + run(Text, code([37], 39)). + +-spec bright_black(binary()) -> binary(). +bright_black(Text) -> + run(Text, code([90], 39)). + +-spec grey(binary()) -> binary(). +grey(Text) -> + bright_black(Text). + +-spec gray(binary()) -> binary(). +gray(Text) -> + bright_black(Text). + +-spec bright_red(binary()) -> binary(). +bright_red(Text) -> + run(Text, code([91], 39)). + +-spec bright_green(binary()) -> binary(). +bright_green(Text) -> + run(Text, code([92], 39)). + +-spec bright_yellow(binary()) -> binary(). +bright_yellow(Text) -> + run(Text, code([93], 39)). + +-spec bright_blue(binary()) -> binary(). +bright_blue(Text) -> + run(Text, code([94], 39)). + +-spec bright_magenta(binary()) -> binary(). +bright_magenta(Text) -> + run(Text, code([95], 39)). + +-spec bright_cyan(binary()) -> binary(). +bright_cyan(Text) -> + run(Text, code([96], 39)). + +-spec bright_white(binary()) -> binary(). +bright_white(Text) -> + run(Text, code([97], 39)). + +-spec hex(binary(), integer()) -> binary(). +hex(Text, Colour) -> + Colour@1 = gleam@int:clamp(Colour, 16#0, 16#ffffff), + run( + Text, + code( + [38, + 2, + begin + _pipe = erlang:'bsr'(Colour@1, 16), + erlang:'band'(_pipe, 16#ff) + end, + begin + _pipe@1 = erlang:'bsr'(Colour@1, 8), + erlang:'band'(_pipe@1, 16#ff) + end, + erlang:'band'(Colour@1, 16#ff)], + 39 + ) + ). + +-spec pink(binary()) -> binary(). +pink(Text) -> + hex(Text, 16#ffaff3). + +-spec colour(binary(), gleam_community@colour:colour()) -> binary(). +colour(Text, Colour) -> + Hex_colour = gleam_community@colour:to_rgb_hex(Colour), + hex(Text, Hex_colour). + +-spec color(binary(), gleam_community@colour:colour()) -> binary(). +color(Text, Color) -> + colour(Text, Color). + +-spec bg_black(binary()) -> binary(). +bg_black(Text) -> + run(Text, code([40], 49)). + +-spec bg_red(binary()) -> binary(). +bg_red(Text) -> + run(Text, code([41], 49)). + +-spec bg_green(binary()) -> binary(). +bg_green(Text) -> + run(Text, code([42], 49)). + +-spec bg_yellow(binary()) -> binary(). +bg_yellow(Text) -> + run(Text, code([43], 49)). + +-spec bg_blue(binary()) -> binary(). +bg_blue(Text) -> + run(Text, code([44], 49)). + +-spec bg_magenta(binary()) -> binary(). +bg_magenta(Text) -> + run(Text, code([45], 49)). + +-spec bg_cyan(binary()) -> binary(). +bg_cyan(Text) -> + run(Text, code([46], 49)). + +-spec bg_white(binary()) -> binary(). +bg_white(Text) -> + run(Text, code([47], 49)). + +-spec bg_bright_black(binary()) -> binary(). +bg_bright_black(Text) -> + run(Text, code([100], 49)). + +-spec bg_bright_red(binary()) -> binary(). +bg_bright_red(Text) -> + run(Text, code([101], 49)). + +-spec bg_bright_green(binary()) -> binary(). +bg_bright_green(Text) -> + run(Text, code([102], 49)). + +-spec bg_bright_yellow(binary()) -> binary(). +bg_bright_yellow(Text) -> + run(Text, code([103], 49)). + +-spec bg_bright_blue(binary()) -> binary(). +bg_bright_blue(Text) -> + run(Text, code([104], 49)). + +-spec bg_bright_magenta(binary()) -> binary(). +bg_bright_magenta(Text) -> + run(Text, code([105], 49)). + +-spec bg_bright_cyan(binary()) -> binary(). +bg_bright_cyan(Text) -> + run(Text, code([106], 49)). + +-spec bg_bright_white(binary()) -> binary(). +bg_bright_white(Text) -> + run(Text, code([107], 49)). + +-spec bg_hex(binary(), integer()) -> binary(). +bg_hex(Text, Colour) -> + run( + Text, + code( + [48, + 2, + begin + _pipe = erlang:'bsr'(Colour, 16), + erlang:'band'(_pipe, 16#ff) + end, + begin + _pipe@1 = erlang:'bsr'(Colour, 8), + erlang:'band'(_pipe@1, 16#ff) + end, + erlang:'band'(Colour, 16#ff)], + 49 + ) + ). + +-spec bg_pink(binary()) -> binary(). +bg_pink(Text) -> + bg_hex(Text, 16#ffaff3). + +-spec bg_colour(binary(), gleam_community@colour:colour()) -> binary(). +bg_colour(Text, Colour) -> + Hex_colour = gleam_community@colour:to_rgb_hex(Colour), + bg_hex(Text, Hex_colour). + +-spec bg_color(binary(), gleam_community@colour:colour()) -> binary(). +bg_color(Text, Colour) -> + bg_colour(Text, Colour). diff --git a/aoc2023/build/dev/erlang/gleam_community_ansi/ebin/gleam_community@ansi.beam b/aoc2023/build/dev/erlang/gleam_community_ansi/ebin/gleam_community@ansi.beam Binary files differnew file mode 100644 index 0000000..e94b760 --- /dev/null +++ b/aoc2023/build/dev/erlang/gleam_community_ansi/ebin/gleam_community@ansi.beam diff --git a/aoc2023/build/dev/erlang/gleam_community_ansi/ebin/gleam_community_ansi.app b/aoc2023/build/dev/erlang/gleam_community_ansi/ebin/gleam_community_ansi.app new file mode 100644 index 0000000..90e4d4a --- /dev/null +++ b/aoc2023/build/dev/erlang/gleam_community_ansi/ebin/gleam_community_ansi.app @@ -0,0 +1,8 @@ +{application, gleam_community_ansi, [ + {vsn, "1.2.0"}, + {applications, [gleam_community_colour, + gleam_stdlib]}, + {description, "ANSI colours, formatting, and control codes"}, + {modules, []}, + {registered, []} +]}. |