### Question:
Collector implements
        Internal<Collector<T>, List<T>>,
        And<T>,
        Monad<List<T>>,
        Functor<T> { public Logger<Collector<T>, List<T>> log(Object tag) { return new Logger<>(this, configuration, tag); } Collector(InternalConfiguration configuration); @Override Collector<T> and(T item); Chain<List<T>> toList(); @Override R flatMap(@NonNull Function<List<T>, R> flatMapper); Collector<T> forEach(@NonNull Consumer<T> action); Collector<R> map(Function<T, R> mapper); Chain<T> reduce(BiFunction<T, T, T> reducer); Logger<Collector<T>, List<T>> log(Object tag); @Override Proxy<Collector<T>, List<T>> access();  }### Answer:
@Test public void logWithSelfAsSourceThenReturnSelfAsSource() { Collector<?> source = Chain.let(0).collect(Integer.class); Logger<?, ?> logger = source.log("1"); assertEquals(source, logger.source); }
@Test public void logWithStringTagThenReturnLoggerWithThatTag() { Collector<?> source = Chain.let(0).collect(Integer.class); Logger<?, ?> logger = source.log("1"); assertEquals("1", logger.tag); }