diff --git a/src/TruthTables.jl b/src/TruthTables.jl index c969904..91d10bb 100644 --- a/src/TruthTables.jl +++ b/src/TruthTables.jl @@ -6,6 +6,7 @@ export @truthtable export -->, <--> export ∧, ∨, ¬ +include("showmode.jl") include("truthtable.jl") include("tables.jl") include("macro.jl") diff --git a/src/showmode.jl b/src/showmode.jl new file mode 100644 index 0000000..b666428 --- /dev/null +++ b/src/showmode.jl @@ -0,0 +1,93 @@ +const SHOW_MODE = Ref(:bool) + +""" + TruthTables.showmode!(mode::Symbol = :bool) + +Changes the way `TruthTable`s are displayed.\\ +The mode argument can be one of these symbols: `:bool` (default), `:bit` or `:letter`.\\ +`:bool` will use the boolean values (`true` and `false`) without formatting.\\ +`:bit` will use `1` and `0` for `true` and `false`, respectively.\\ +`:letter` will use T for `true` and F for `false`. + +# Examples + +```julia +julia> using TruthTables + +julia> tt = @truthtable p && q +TruthTable +┌───────┬───────┬───────┐ +│ p │ q │ p ∧ q │ +├───────┼───────┼───────┤ +│ true │ true │ true │ +│ false │ true │ false │ +│ true │ false │ false │ +│ false │ false │ false │ +└───────┴───────┴───────┘ + + +julia> TruthTables.showmode!(:bit) +:bit + +julia> tt +TruthTable +┌───┬───┬───────┐ +│ p │ q │ p ∧ q │ +├───┼───┼───────┤ +│ 1 │ 1 │ 1 │ +│ 0 │ 1 │ 0 │ +│ 1 │ 0 │ 0 │ +│ 0 │ 0 │ 0 │ +└───┴───┴───────┘ + + +julia> TruthTables.showmode!(:letter) +:letter + +julia> tt +TruthTable +┌───┬───┬───────┐ +│ p │ q │ p ∧ q │ +├───┼───┼───────┤ +│ T │ T │ T │ +│ F │ T │ F │ +│ T │ F │ F │ +│ F │ F │ F │ +└───┴───┴───────┘ + + +julia> TruthTables.showmode!() +:bool + +julia> tt +TruthTable +┌───────┬───────┬───────┐ +│ p │ q │ p ∧ q │ +├───────┼───────┼───────┤ +│ true │ true │ true │ +│ false │ true │ false │ +│ true │ false │ false │ +│ false │ false │ false │ +└───────┴───────┴───────┘ +``` +""" +function showmode!(mode::Symbol) + if mode ∉ (:bool, :bit, :letter) + throw(ArgumentError("Invalid show mode, use :bool, :bit or :letter.")) + end + SHOW_MODE[] = mode +end + +showmode!() = (SHOW_MODE[] = :bool) + +# formatters +_bit_formatter(v, i, j) = Int(v) +_letter_formatter(v, i, j) = v ? "T" : "F" + +function getformatter() + mode = SHOW_MODE[] + mode == :bool && return nothing + mode == :bit && return _bit_formatter + mode == :letter && return _letter_formatter + return nothing +end diff --git a/src/truthtable.jl b/src/truthtable.jl index 6abcd19..d78a68e 100644 --- a/src/truthtable.jl +++ b/src/truthtable.jl @@ -10,11 +10,13 @@ function TruthTable(columns::Vector{Vector{Bool}}, colnames::Vector{Symbol}) end function Base.show(io::IO, table::TruthTable) + formatter = getformatter() println(io, "TruthTable") pretty_table(io, table, vcrop_mode=:middle, header_alignment=:c, header=table.colnames, + formatters=formatter, alignment=:l ) end diff --git a/test/runtests.jl b/test/runtests.jl index 5f58074..d42b45d 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,7 +1,6 @@ using Test, Tables using TruthTables using TruthTables: TruthTable -using TruthTables: -->, <-->, ∧, ∨, ¬ @testset "TruthTables.jl" begin @testset "TruthTable" begin @@ -72,6 +71,10 @@ using TruthTables: -->, <-->, ∧, ∨, ¬ end @testset "TruthTable show" begin + # default show mode + @test TruthTables.showmode!() == :bool + + # show mode: :bool tt = @truthtable p && (q || r) str = """ TruthTable @@ -88,9 +91,48 @@ using TruthTables: -->, <-->, ∧, ∨, ¬ │ false │ false │ false │ false │ └───────┴───────┴───────┴─────────────┘ """ - @test sprint(show, tt) == str + # show mode: :bit + TruthTables.showmode!(:bit) + str = """ + TruthTable + ┌───┬───┬───┬─────────────┐ + │ p │ q │ r │ p ∧ (q ∨ r) │ + ├───┼───┼───┼─────────────┤ + │ 1 │ 1 │ 1 │ 1 │ + │ 0 │ 1 │ 1 │ 0 │ + │ 1 │ 0 │ 1 │ 1 │ + │ 0 │ 0 │ 1 │ 0 │ + │ 1 │ 1 │ 0 │ 1 │ + │ 0 │ 1 │ 0 │ 0 │ + │ 1 │ 0 │ 0 │ 0 │ + │ 0 │ 0 │ 0 │ 0 │ + └───┴───┴───┴─────────────┘ + """ + @test sprint(show, tt) == str + + # show mode: :letter + TruthTables.showmode!(:letter) + str = """ + TruthTable + ┌───┬───┬───┬─────────────┐ + │ p │ q │ r │ p ∧ (q ∨ r) │ + ├───┼───┼───┼─────────────┤ + │ T │ T │ T │ T │ + │ F │ T │ T │ F │ + │ T │ F │ T │ T │ + │ F │ F │ T │ F │ + │ T │ T │ F │ T │ + │ F │ T │ F │ F │ + │ T │ F │ F │ F │ + │ F │ F │ F │ F │ + └───┴───┴───┴─────────────┘ + """ + @test sprint(show, tt) == str + + # show mode: :bool (default) + TruthTables.showmode!() tt = @truthtable p && (q || r) full=true str = """ TruthTable @@ -107,8 +149,62 @@ using TruthTables: -->, <-->, ∧, ∨, ¬ │ false │ false │ false │ false │ false │ └───────┴───────┴───────┴───────┴─────────────┘ """ - @test sprint(show, tt) == str + + # show mode: :bit + TruthTables.showmode!(:bit) + str = """ + TruthTable + ┌───┬───┬───┬───────┬─────────────┐ + │ p │ q │ r │ q ∨ r │ p ∧ (q ∨ r) │ + ├───┼───┼───┼───────┼─────────────┤ + │ 1 │ 1 │ 1 │ 1 │ 1 │ + │ 0 │ 1 │ 1 │ 1 │ 0 │ + │ 1 │ 0 │ 1 │ 1 │ 1 │ + │ 0 │ 0 │ 1 │ 1 │ 0 │ + │ 1 │ 1 │ 0 │ 1 │ 1 │ + │ 0 │ 1 │ 0 │ 1 │ 0 │ + │ 1 │ 0 │ 0 │ 0 │ 0 │ + │ 0 │ 0 │ 0 │ 0 │ 0 │ + └───┴───┴───┴───────┴─────────────┘ + """ + @test sprint(show, tt) == str + + # show mode: :letter + TruthTables.showmode!(:letter) + str = """ + TruthTable + ┌───┬───┬───┬───────┬─────────────┐ + │ p │ q │ r │ q ∨ r │ p ∧ (q ∨ r) │ + ├───┼───┼───┼───────┼─────────────┤ + │ T │ T │ T │ T │ T │ + │ F │ T │ T │ T │ F │ + │ T │ F │ T │ T │ T │ + │ F │ F │ T │ T │ F │ + │ T │ T │ F │ T │ T │ + │ F │ T │ F │ T │ F │ + │ T │ F │ F │ F │ F │ + │ F │ F │ F │ F │ F │ + └───┴───┴───┴───────┴─────────────┘ + """ + @test sprint(show, tt) == str + + # getformatter + TruthTables.showmode!(:bit) + @test TruthTables.getformatter() === TruthTables._bit_formatter + TruthTables.showmode!(:letter) + @test TruthTables.getformatter() === TruthTables._letter_formatter + TruthTables.showmode!(:bool) + @test TruthTables.getformatter() === nothing + + # formatters + @test TruthTables._bit_formatter(true, 1, 1) == 1 + @test TruthTables._bit_formatter(false, 1, 1) == 0 + @test TruthTables._letter_formatter(true, 1, 1) == "T" + @test TruthTables._letter_formatter(false, 1, 1) == "F" + + # throws + @test_throws ArgumentError TruthTables.showmode!(:test) end @testset "Logical operators" begin