JuliaLogging / LoggingExtras.jl

Composable Loggers for the Julia Logging StdLib

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Add Curried/partially applied form?

oxinabox opened this issue · comments

If everything that takes 2 arguments:
i.e. the Filters and the Transform
had an overload to just take the nonlogger argument,
then it might be prettier

Rather than writing:

const ConsoleLogger(stream, min_level) = 
	MinLevelLogger(
		ActiveFilteredLogger(max_log_filter,
			PureConsoleLogger(stream)
		),
		min_level
	)

we could write ∘

const ConsoleLogger(stream, min_level) = 
	MinLevelLogger(min_level) ∘ ActiveFilteredLogger(max_log_filter) ∘ PureConsoleLogger(stream)

Which would pleasently drive home the compositional nature of the system.

cf this thread
#9 (comment)

I am now thinking overloading constructors so they don't construct is too evil.

Maybe they should all have lowercase varients for that.

Playing with some things

using Logging: Warn, Info

@testset "1 composition Example" begin
    constructor_form = MinLevelLogger(FileLogger("warn.log"), Warn))
    curried_form = min_level_logger(Warn)(FileLogger("warn.log"))
    piped_form = FileLogger("warn.log") |> min_level_logger(Warn)
    @test constructor_form == curried_form ==  piped_form
end

@testset "2 compositions Example" begin
    constructor_form = MinLevelLogger(
        EarlyFilteredLogger(
            log->log._module==Main,
            FileLogger("warn.log"),
        ),
        Warn
    )

    comp_logger1 = min_level_logger(Warn)  EarlyFilteredLogger(log->log._module==Main)
    comp_form = comp_logger1(FileLogger("warn.log"))

    level_filter = min_level_logger(Warn)
    module_filter = EarlyFilteredLogger(log->log._module==Main)
    curried_form = level_filter(module_filter(FileLogger("warn.log")))

    @test comp_form == constructor_form == curried_form
end

Tee could be weirder,
idk which if any of these should be allowed

using Logging: Warn, Info
@testset "Tee and merge" begin
    sink = FileLogger("all.log")
    constructed_form = TeeLogger(
        MinLevelLogger(sink, Info),
        MinLevelLogger(sink, Warn),
    );

    curried_form = tee_logger(
        min_level_logger(Warn),
        min_level_logger(Warn)
    )(sink)

    curried_form2 = tee_logger(
        min_level_logger(Warn),
        min_level_logger(Warn)
    )(sink, sink)


    @test constructed_form == curried_form == curried_form2
end