10
|
1 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser;
|
|
2
|
|
3 import java.util.Iterator;
|
26
|
4
|
|
5 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
|
|
6 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
|
|
7 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
|
10
|
8 import fj.data.List;
|
|
9
|
26
|
10 public class DefaultTraverser<T extends Parent<T>> implements Traverser<T>
|
10
|
11 {
|
|
12 @Override
|
26
|
13 public Either<Error,Traversal<T>> traverse(final T _root,Evaluator<T> _evaluator)
|
10
|
14 {
|
26
|
15 Children<T> wrapper = new Children<T>(){
|
|
16 @Override
|
|
17 public Iterator<T> iterator(){
|
|
18 List<T> list = List.nil();
|
|
19 return list.cons(_root).iterator();
|
|
20 }
|
23
|
21 @Override
|
26
|
22 public int size(){
|
|
23 return 1;
|
|
24 }
|
|
25 };
|
|
26
|
|
27 Either<Error,List<T>> ret = _traverse(wrapper,_evaluator);
|
|
28 if(ret.isA()){
|
|
29 return DefaultEither.newA(ret.a());
|
|
30 }
|
|
31
|
|
32 final Iterable<T> iterable = ret.b();
|
|
33 final T destination = ret.b().last();
|
|
34
|
|
35 Traversal<T> traversal = new Traversal<T>(){
|
|
36 @Override
|
|
37 public Iterator<T> iterator(){
|
|
38 return iterable.iterator();
|
|
39 }
|
23
|
40
|
26
|
41 @Override
|
|
42 public T destination(){
|
|
43 return destination;
|
23
|
44 }
|
|
45 };
|
|
46
|
26
|
47 return DefaultEither.newB(traversal);
|
10
|
48 }
|
|
49
|
26
|
50 private Either<Error,List<T>> _traverse(Children<T> _chs,Evaluator<T> _evaluator)
|
10
|
51 {
|
|
52 int pos = 0;
|
26
|
53 for(T ch : _chs){
|
|
54 Evaluation<T> e = _evaluator.evaluate(ch,pos);
|
|
55 Result r = e.result();
|
|
56 if(r == Result.ACCEPT){
|
|
57 return _accept(ch,e.evaluator());
|
|
58 }
|
10
|
59
|
26
|
60 if(r == Result.BREAK){
|
|
61 break;
|
|
62 }
|
|
63
|
|
64 if(r == Result.CONTINUE){
|
|
65 continue;
|
10
|
66 }
|
|
67
|
26
|
68 return DefaultEither.newA(TraverserError.UNDEFINED_OPERATOR);
|
10
|
69 }
|
|
70
|
26
|
71 List<T> empty = List.nil();
|
|
72 Either<Error,List<T>> ret = DefaultEither.newB(empty);
|
|
73 return ret;
|
|
74 }
|
|
75
|
|
76 private Either<Error,List<T>> _accept(T _current,Evaluator<T> _evaluator)
|
|
77 {
|
|
78 Children<T> chs = _current.children();
|
|
79 Either<Error,List<T>> either = _traverse(chs,_evaluator);
|
|
80 if(either.isA()){
|
|
81 return either;
|
10
|
82 }
|
|
83
|
26
|
84 List<T> list = either.b();
|
|
85 List<T> newList = list.cons(_current);
|
|
86 return DefaultEither.newB(newList);
|
10
|
87 }
|
|
88 }
|