Add multiple multiple & reduce trace

This commit is contained in:
jeffcheasey88 2023-07-18 18:36:50 +02:00
parent e81a509f48
commit 39a20c42a0

View file

@ -13,13 +13,14 @@ public class BuilderStateTree<E, B> extends StateTree<B>{
private BiFunction<E, Bag, B> builder; private BiFunction<E, Bag, B> builder;
private List<StateTree<E>> childs; private List<StateTree<E>> childs;
private StateTree<E> multiple; private List<StateTree<E>> multiple;
public BuilderStateTree(BiFunction<E, Bag, B> builder){ public BuilderStateTree(BiFunction<E, Bag, B> builder){
super(); super();
this.builder = builder; this.builder = builder;
this.childs = new ArrayList<>(); this.childs = new ArrayList<>();
this.multiple = new ArrayList<>();
} }
B build(TokenValidator validator, E element){ B build(TokenValidator validator, E element){
@ -29,50 +30,43 @@ public class BuilderStateTree<E, B> extends StateTree<B>{
BuilderStateTree<B, ?> builded = super.internalSeed(validator, build); BuilderStateTree<B, ?> builded = super.internalSeed(validator, build);
if(builded != null) builded.build(validator, build); if(builded != null) builded.build(validator, build);
internalSeedNoChilds(validator, element); BuilderStateTree<E, ?> sub_builded;
return build; for(StateTree<E> state : this.multiple){
}
void internalSeedNoChilds(TokenValidator validator, E element){
if(multiple != null){
TokenValidator branch = validator.branch(); TokenValidator branch = validator.branch();
if(multiple.checker == null){ if(state.checker == null){
BuilderStateTree<E, ?> builded; while((sub_builded = state.internalSeed(branch, element)) != null){
while((builded = multiple.internalSeed(branch, element)) != null){
validator.merge(branch); validator.merge(branch);
builded.build(validator, element); sub_builded.build(validator, element);
} }
}else{ }else{
while(multiple.checker.apply(branch)){ while(state.checker.apply(branch)){
BuilderStateTree<E, ?> builded = multiple.internalSeed(branch, element); sub_builded = state.internalSeed(branch, element);
if(builded != null){ if(sub_builded == null) break;
validator.merge(branch); validator.merge(branch);
builded.build(validator, element); sub_builded.build(validator, element);
}
} }
} }
} }
for(StateTree<E> child : this.childs){ for(StateTree<E> child : this.childs){
TokenValidator branch = validator.branch(); TokenValidator branch = validator.branch();
if(child.checker == null){ if(child.checker == null){
BuilderStateTree<E, ?> builded = child.internalSeed(branch, element); sub_builded = child.internalSeed(branch, element);
if(builded != null){ if(sub_builded == null) continue;
validator.merge(branch); validator.merge(branch);
builded.build(validator, element); sub_builded.build(validator, element);
return; break;
}
continue;
} }
if(child.checker.apply(branch)){ if(child.checker.apply(branch)){
BuilderStateTree<E, ?> builded = child.internalSeed(branch, element); sub_builded = child.internalSeed(branch, element);
if(builded != null){ if(sub_builded == null) continue;
validator.merge(branch); validator.merge(branch);
builded.build(validator, element); sub_builded.build(validator, element);
return; break;
}
} }
} }
return build;
} }
public <T extends StateTree<E>> StateTree<E> thenNoChild(StateTree<E> child){ public <T extends StateTree<E>> StateTree<E> thenNoChild(StateTree<E> child){
@ -88,7 +82,7 @@ public class BuilderStateTree<E, B> extends StateTree<B>{
} }
public <T extends StateTree<E>> StateTree<E> multiple(StateTree<E> child){ public <T extends StateTree<E>> StateTree<E> multiple(StateTree<E> child){
this.multiple = child; this.multiple.add(child);
return child; return child;
} }
} }