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 List<StateTree<E>> childs;
private StateTree<E> multiple;
private List<StateTree<E>> multiple;
public BuilderStateTree(BiFunction<E, Bag, B> builder){
super();
this.builder = builder;
this.childs = new ArrayList<>();
this.multiple = new ArrayList<>();
}
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);
if(builded != null) builded.build(validator, build);
internalSeedNoChilds(validator, element);
BuilderStateTree<E, ?> sub_builded;
return build;
}
void internalSeedNoChilds(TokenValidator validator, E element){
if(multiple != null){
for(StateTree<E> state : this.multiple){
TokenValidator branch = validator.branch();
if(multiple.checker == null){
BuilderStateTree<E, ?> builded;
while((builded = multiple.internalSeed(branch, element)) != null){
if(state.checker == null){
while((sub_builded = state.internalSeed(branch, element)) != null){
validator.merge(branch);
builded.build(validator, element);
sub_builded.build(validator, element);
}
}else{
while(multiple.checker.apply(branch)){
BuilderStateTree<E, ?> builded = multiple.internalSeed(branch, element);
if(builded != null){
validator.merge(branch);
builded.build(validator, element);
}
while(state.checker.apply(branch)){
sub_builded = state.internalSeed(branch, element);
if(sub_builded == null) break;
validator.merge(branch);
sub_builded.build(validator, element);
}
}
}
for(StateTree<E> child : this.childs){
TokenValidator branch = validator.branch();
if(child.checker == null){
BuilderStateTree<E, ?> builded = child.internalSeed(branch, element);
if(builded != null){
validator.merge(branch);
builded.build(validator, element);
return;
}
continue;
sub_builded = child.internalSeed(branch, element);
if(sub_builded == null) continue;
validator.merge(branch);
sub_builded.build(validator, element);
break;
}
if(child.checker.apply(branch)){
BuilderStateTree<E, ?> builded = child.internalSeed(branch, element);
if(builded != null){
validator.merge(branch);
builded.build(validator, element);
return;
}
sub_builded = child.internalSeed(branch, element);
if(sub_builded == null) continue;
validator.merge(branch);
sub_builded.build(validator, element);
break;
}
}
return build;
}
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){
this.multiple = child;
this.multiple.add(child);
return child;
}
}