From 1df7bc90c7a9ddb8a4caf3e2acbcd5d0fe6ea9c2 Mon Sep 17 00:00:00 2001 From: Alexander Plavin Date: Sun, 22 Dec 2024 16:10:27 -0500 Subject: [PATCH] =?UTF-8?q?don't=20append=20"=20=E2=88=98=20(@o=20=5F)"=20?= =?UTF-8?q?in=20show=5Foptic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit show_optic is not a public API, but convenient to use sometimes before, it appended " ∘ (@o _)" unnecessarily for objects that don't have explicit show_optic handling --- src/sugar.jl | 24 ++++++++++++++---------- test/test_core.jl | 5 +++++ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/sugar.jl b/src/sugar.jl index a189c03f..d3f9f834 100644 --- a/src/sugar.jl +++ b/src/sugar.jl @@ -521,19 +521,23 @@ function show_optic(io, optic) outer = Iterators.dropwhile(x -> applicable(_shortstring, "", x), opts) if !isempty(outer) show(io, opcompose(outer...)) + end + if !isempty(inner) && !isempty(outer) print(io, " ∘ ") end - shortstr = reduce(inner; init=("_", false)) do (prev, need_parens_prev), o - # if _need_parens is true for this o and the one before, wrap the previous one in parentheses - if need_parens_prev && _need_parens(o) - prev = "($prev)" + if !isempty(inner) + shortstr = reduce(inner; init=("_", false)) do (prev, need_parens_prev), o + # if _need_parens is true for this o and the one before, wrap the previous one in parentheses + if need_parens_prev && _need_parens(o) + prev = "($prev)" + end + _shortstring(prev, o), _need_parens(o) + end |> first + if get(io, :compact, false) + print(io, shortstr) + else + print(io, "(@o ", shortstr, ")") end - _shortstring(prev, o), _need_parens(o) - end |> first - if get(io, :compact, false) - print(io, shortstr) - else - print(io, "(@o ", shortstr, ")") end end diff --git a/test/test_core.jl b/test/test_core.jl index 49c09ddb..33f2bfa2 100644 --- a/test/test_core.jl +++ b/test/test_core.jl @@ -470,6 +470,11 @@ end @test sprint(show, (@optic log(_.a[2])); context=:compact => true) == "log(_.a[2])" @test sprint(show, (@optic Base.tail(_.a[2])); context=:compact => true) == "tail(_.a[2])" # non-exported function @test sprint(show, (@optic Base.Fix2(_.a[2])); context=:compact => true) == "Fix2(_.a[2])" # non-exported type + + # show_optic is reasonable even for types without special show_optic handling: + o = Recursive(x->true, Properties()) + @test sprint(Accessors.show_optic, o) == "$o" + @test sprint(Accessors.show_optic, (@o _.a) ∘ o) == "(@o _.a) ∘ $o" end @testset "text/plain show" begin