package org.andork.redux.logger; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.function.Consumer; import org.andork.redux.Action; import org.andork.redux.Dispatcher; import org.andork.redux.Middleware; import org.andork.redux.Store; public class Logger implements Middleware { private Consumer<String> log = System.out::println; private DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss.SSS"); private boolean logState = true; public Logger dateFormat(DateFormat dateFormat) { this.dateFormat = dateFormat; return this; } public Logger log(Consumer<String> log) { this.log = log; return this; } public Logger logState(boolean logState) { this.logState = logState; return this; } @Override public ForStore store(Store<?> store) { return new ForStore() { @Override public Dispatcher next(Dispatcher next) { return new Dispatcher() { @Override public Object dispatch(Action action) { Date date = new Date(); Object prevState = store.getState(); Object result = next.dispatch(action); Object nextState = store.getState(); log.accept(dateFormat.format(date) + " " + action.type); if (logState) { System.out.println(" prevState: " + prevState); } log.accept(" action: " + action); if (logState) { log.accept(" nextState: " + nextState); } return result; } }; } }; } }