Add multiple multiple & reduce trace
This commit is contained in:
parent
e81a509f48
commit
39a20c42a0
1 changed files with 25 additions and 31 deletions
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue