Pdsui.java
package net.splitcells.dem.resource.communication.interaction;
import net.splitcells.dem.data.set.list.ListWA;
import net.splitcells.dem.lang.perspective.Perspective;
import net.splitcells.dem.resource.communication.Sender;
import java.util.function.Predicate;
import static net.splitcells.dem.utils.NotImplementedYet.notImplementedYet;
/**
* Pdsui = Path Based Dom Stream User Interface
*/
public class Pdsui implements Ui {
public static Pdsui pdsui(Sender<String> output, Predicate<LogMessage<Perspective>> messageFilter) {
return new Pdsui(output, messageFilter);
}
private final Sender<String> output;
private final Predicate<LogMessage<Perspective>> messageFilter;
private Pdsui(Sender<String> output, Predicate<LogMessage<Perspective>> messageFilter) {
this.output = output;
this.messageFilter = messageFilter;
}
@Override
public <R extends ListWA<LogMessage<Perspective>>> R append(LogMessage<Perspective> arg) {
if (messageFilter.test(arg)) {
print(output, arg.content());
}
return (R) this;
}
private static void print(Sender<String> output, Perspective content, String prefix) {
if (content.children().size() == 1) {
if (prefix.isEmpty()) {
print(output, content.children().get(0), content.name());
} else {
print(output, content.children().get(0), prefix + "." + content.name());
}
return;
} else if (content.children().size() > 0) {
output.append(prefix + content.name() + ":");
} else if (content.children().size() == 0) {
if (prefix.isEmpty()) {
output.append(content.name());
} else {
output.append(prefix + "." + content.name());
}
return;
} else {
throw new UnsupportedOperationException();
}
content.children().forEach(child -> {
print(Sender.extend(output, "\t", ""), child);
});
}
private static void print(Sender<String> output, Perspective content) {
print(output, content, "");
}
@Override
public void close() {
output.close();
}
@Override
public void flush() {
output.flush();
}
}