package spimedb;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
/**
* Created by me on 4/1/17.
*/
public interface NObjectConsumer extends Consumer<NObject> {
public static NObjectConsumer Tagged(Consumer<NObject> each, String... tags) {
return new OnTag.LambdaOnTag(tags, each);
}
public static NObjectConsumer HashPredicate(BiConsumer<String,String> each, String... tags) {
return new OnHashPredicate.LambdaHashPredicate(each, tags);
}
abstract class OnTag implements NObjectConsumer {
public final String[] any;
public OnTag(String... any) {
this.any = any;
}
public static class LambdaOnTag extends OnTag {
final Consumer<NObject> target;
LambdaOnTag(String[] tags, Consumer<NObject> target) {
super(tags);
this.target = target;
}
@Override
public void accept(NObject x) {
target.accept(x);
}
}
}
abstract class OnHashPredicate extends OnTag {
public OnHashPredicate(String... any) {
super(any);
}
@Override
public void accept(NObject n) {
String name = n.name();
if (name.charAt(0) == '#') {
//TODO parse better
int hashTagEnds = name.indexOf('(');
if (hashTagEnds == -1) return;
String hash = name.substring(1, hashTagEnds);
String predicate = name.substring(hashTagEnds+1, name.length()-1);
onHashPredicate(hash, predicate);
}
}
abstract protected void onHashPredicate(String hash, String predicate);
static final class LambdaHashPredicate extends OnHashPredicate {
private final BiConsumer<String, String> each;
public LambdaHashPredicate(BiConsumer<String, String> each, String... tags) {
super(tags);
this.each = each;
}
@Override
protected void onHashPredicate(String hash, String predicate) {
each.accept(hash, predicate);
}
}
}
}