-module(spruce@group). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/spruce/group.gleam"). -export([render_title/2, group/3, indent/2]). -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(" Depth-in-context grouped output helpers.\n"). -file("src/spruce/group.gleam", 30). -spec title_line(spruce:spruce(), binary()) -> binary(). title_line(Sp, Title) -> case spruce:supports_color(Sp) of false -> <<<<(<<"▸"/utf8>>)/binary, " "/utf8>>/binary, Title/binary>>; true -> <<<<(spruce@style:render( Sp, spruce@palette:hash(Sp, Title), <<"▸"/utf8>> ))/binary, " "/utf8>>/binary, (spruce@style:render( Sp, begin _pipe = spruce@style:new(), spruce@style:bold(_pipe) end, Title ))/binary>> end. -file("src/spruce/group.gleam", 26). ?DOC( " Render a group title line (indent prefix + styled marker + title), the same\n" " line that `group` prints. Exposed so buffered output (`spruce/output`) can\n" " compose group titles without duplicating the styling.\n" ). -spec render_title(spruce:spruce(), binary()) -> binary(). render_title(Sp, Title) -> <<(spruce@internal@layout:indent_prefix(Sp))/binary, (title_line(Sp, Title))/binary>>. -file("src/spruce/group.gleam", 18). ?DOC( " Print a group title, then run `body` with a context indented one level deeper.\n" "\n" " This is the eager, streaming form of grouping: the title prints immediately\n" " and `body` runs right away, so its output appears as work happens and it may\n" " perform IO and return any value. For deferred, pipe-composable grouping that\n" " buffers output instead, see `spruce/output.group`.\n" ). -spec group(spruce:spruce(), binary(), fun((spruce:spruce()) -> IOB)) -> IOB. group(Sp, Title, Body) -> gleam_stdlib:println(render_title(Sp, Title)), Body(spruce:indented(Sp)). -file("src/spruce/group.gleam", 41). ?DOC(" Prefix every line in `text` with two spaces for each indent level.\n"). -spec indent(binary(), integer()) -> binary(). indent(Text, Level) -> Prefix = gleam@string:repeat(<<" "/utf8>>, Level), _pipe = Text, _pipe@1 = gleam@string:split(_pipe, <<"\n"/utf8>>), _pipe@2 = gleam@list:map( _pipe@1, fun(Line) -> <> end ), gleam@string:join(_pipe@2, <<"\n"/utf8>>).