annotate src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/DefaultTraverser.java @ 175:e26462a38ce0

add push pop
author tatsuki
date Fri, 06 Mar 2015 10:44:50 +0900
parents fb1dc448ac8c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10
Shoshi TAMAKI
parents:
diff changeset
1 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser;
Shoshi TAMAKI
parents:
diff changeset
2
Shoshi TAMAKI
parents:
diff changeset
3 import java.util.Iterator;
26
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
4
36
Shoshi TAMAKI
parents: 32
diff changeset
5 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children;
68
240a385bf79d delete traversalNodewrapper but not change test source(error)
one
parents: 44
diff changeset
6 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
41
ed6737db637a added tests
Shoshi TAMAKI
parents: 36
diff changeset
7 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditorError;
26
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
8 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
9 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
10 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
10
Shoshi TAMAKI
parents:
diff changeset
11 import fj.data.List;
Shoshi TAMAKI
parents:
diff changeset
12
32
Shoshi TAMAKI
parents: 31
diff changeset
13 public class DefaultTraverser implements Traverser
10
Shoshi TAMAKI
parents:
diff changeset
14 {
Shoshi TAMAKI
parents:
diff changeset
15 @Override
86
fb1dc448ac8c delete <T extends TreeNode>
one
parents: 81
diff changeset
16 public Either<Error,Traversal> traverse(final TreeNode _root,Evaluator _evaluator)
10
Shoshi TAMAKI
parents:
diff changeset
17 {
86
fb1dc448ac8c delete <T extends TreeNode>
one
parents: 81
diff changeset
18 Children wrapper = new Children(){
26
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
19 @Override
86
fb1dc448ac8c delete <T extends TreeNode>
one
parents: 81
diff changeset
20 public Iterator<TreeNode> iterator(){
fb1dc448ac8c delete <T extends TreeNode>
one
parents: 81
diff changeset
21 List<TreeNode> list = List.nil();
26
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
22 return list.cons(_root).iterator();
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
23 }
175
e26462a38ce0 add push pop
tatsuki
parents: 86
diff changeset
24
23
Shoshi TAMAKI
parents: 14
diff changeset
25 @Override
26
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
26 public int size(){
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
27 return 1;
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
28 }
175
e26462a38ce0 add push pop
tatsuki
parents: 86
diff changeset
29
41
ed6737db637a added tests
Shoshi TAMAKI
parents: 36
diff changeset
30 @Override
86
fb1dc448ac8c delete <T extends TreeNode>
one
parents: 81
diff changeset
31 public Either<Error,TreeNode> at(int _pos){
41
ed6737db637a added tests
Shoshi TAMAKI
parents: 36
diff changeset
32 if(_pos != 0){
ed6737db637a added tests
Shoshi TAMAKI
parents: 36
diff changeset
33 return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS);
ed6737db637a added tests
Shoshi TAMAKI
parents: 36
diff changeset
34 }
ed6737db637a added tests
Shoshi TAMAKI
parents: 36
diff changeset
35 return DefaultEither.newB(_root);
ed6737db637a added tests
Shoshi TAMAKI
parents: 36
diff changeset
36 }
26
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
37 };
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
38
44
449d67be0886 added tests
Shoshi TAMAKI
parents: 43
diff changeset
39 //Children<T> chs = _root.getChildren();
86
fb1dc448ac8c delete <T extends TreeNode>
one
parents: 81
diff changeset
40 Children chs = wrapper;
43
1c91c4357228 added traverser test
Shoshi TAMAKI
parents: 41
diff changeset
41
81
715a9fbf02fc remove <T> many source
one
parents: 68
diff changeset
42 Either<Error,List<Direction<TreeNode>>> ret = _traverse(chs,_evaluator,-1);
175
e26462a38ce0 add push pop
tatsuki
parents: 86
diff changeset
43
26
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
44 if(ret.isA()){
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
45 return DefaultEither.newA(ret.a());
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
46 }
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
47
81
715a9fbf02fc remove <T> many source
one
parents: 68
diff changeset
48 List<Direction<TreeNode>> list = ret.b();
44
449d67be0886 added tests
Shoshi TAMAKI
parents: 43
diff changeset
49
81
715a9fbf02fc remove <T> many source
one
parents: 68
diff changeset
50 final Iterable<Direction<TreeNode>> iterable = list;
715a9fbf02fc remove <T> many source
one
parents: 68
diff changeset
51 final TreeNode destination = ret.b().last().getTarget();
26
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
52
86
fb1dc448ac8c delete <T extends TreeNode>
one
parents: 81
diff changeset
53 Traversal traversal = new Traversal(){
26
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
54 @Override
81
715a9fbf02fc remove <T> many source
one
parents: 68
diff changeset
55 public Iterator<Direction<TreeNode>> iterator(){
26
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
56 return iterable.iterator();
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
57 }
23
Shoshi TAMAKI
parents: 14
diff changeset
58
26
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
59 @Override
81
715a9fbf02fc remove <T> many source
one
parents: 68
diff changeset
60 public TreeNode destination(){
26
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
61 return destination;
23
Shoshi TAMAKI
parents: 14
diff changeset
62 }
Shoshi TAMAKI
parents: 14
diff changeset
63 };
Shoshi TAMAKI
parents: 14
diff changeset
64
26
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
65 return DefaultEither.newB(traversal);
10
Shoshi TAMAKI
parents:
diff changeset
66 }
Shoshi TAMAKI
parents:
diff changeset
67
86
fb1dc448ac8c delete <T extends TreeNode>
one
parents: 81
diff changeset
68 private Either<Error,List<Direction<TreeNode>>> _traverse(Children _chs,Evaluator _evaluator,int _pos)
10
Shoshi TAMAKI
parents:
diff changeset
69 {
44
449d67be0886 added tests
Shoshi TAMAKI
parents: 43
diff changeset
70 int pos = _pos;
81
715a9fbf02fc remove <T> many source
one
parents: 68
diff changeset
71 for(TreeNode ch : _chs){
32
Shoshi TAMAKI
parents: 31
diff changeset
72 Evaluation e = _evaluator.evaluate(ch,pos);
26
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
73 Result r = e.result();
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
74 if(r == Result.ACCEPT){
28
Shoshi TAMAKI
parents: 26
diff changeset
75 return _accept(ch,pos,e.evaluator());
26
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
76 }
10
Shoshi TAMAKI
parents:
diff changeset
77
43
1c91c4357228 added traverser test
Shoshi TAMAKI
parents: 41
diff changeset
78 if(r == Result.GOAL){
1c91c4357228 added traverser test
Shoshi TAMAKI
parents: 41
diff changeset
79 return DefaultEither.newB(_goal(ch,pos));
1c91c4357228 added traverser test
Shoshi TAMAKI
parents: 41
diff changeset
80 }
1c91c4357228 added traverser test
Shoshi TAMAKI
parents: 41
diff changeset
81
26
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
82 if(r == Result.BREAK){
43
1c91c4357228 added traverser test
Shoshi TAMAKI
parents: 41
diff changeset
83 break;
26
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
84 }
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
85
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
86 if(r == Result.CONTINUE){
28
Shoshi TAMAKI
parents: 26
diff changeset
87 pos ++;
26
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
88 continue;
10
Shoshi TAMAKI
parents:
diff changeset
89 }
Shoshi TAMAKI
parents:
diff changeset
90
26
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
91 return DefaultEither.newA(TraverserError.UNDEFINED_OPERATOR);
10
Shoshi TAMAKI
parents:
diff changeset
92 }
Shoshi TAMAKI
parents:
diff changeset
93
28
Shoshi TAMAKI
parents: 26
diff changeset
94 return DefaultEither.newA(TraverserError.PATH_NOT_FOUND);
26
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
95 }
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
96
86
fb1dc448ac8c delete <T extends TreeNode>
one
parents: 81
diff changeset
97 private List<Direction<TreeNode>> _goal(final TreeNode _current,final int _pos)
43
1c91c4357228 added traverser test
Shoshi TAMAKI
parents: 41
diff changeset
98 {
86
fb1dc448ac8c delete <T extends TreeNode>
one
parents: 81
diff changeset
99 Direction<TreeNode> d = new Direction<TreeNode>(){
43
1c91c4357228 added traverser test
Shoshi TAMAKI
parents: 41
diff changeset
100 @Override
1c91c4357228 added traverser test
Shoshi TAMAKI
parents: 41
diff changeset
101 public int getPosition()
1c91c4357228 added traverser test
Shoshi TAMAKI
parents: 41
diff changeset
102 {
1c91c4357228 added traverser test
Shoshi TAMAKI
parents: 41
diff changeset
103 return _pos;
1c91c4357228 added traverser test
Shoshi TAMAKI
parents: 41
diff changeset
104 }
1c91c4357228 added traverser test
Shoshi TAMAKI
parents: 41
diff changeset
105 @Override
86
fb1dc448ac8c delete <T extends TreeNode>
one
parents: 81
diff changeset
106 public TreeNode getTarget()
43
1c91c4357228 added traverser test
Shoshi TAMAKI
parents: 41
diff changeset
107 {
1c91c4357228 added traverser test
Shoshi TAMAKI
parents: 41
diff changeset
108 return _current;
1c91c4357228 added traverser test
Shoshi TAMAKI
parents: 41
diff changeset
109 }
1c91c4357228 added traverser test
Shoshi TAMAKI
parents: 41
diff changeset
110 };
1c91c4357228 added traverser test
Shoshi TAMAKI
parents: 41
diff changeset
111
86
fb1dc448ac8c delete <T extends TreeNode>
one
parents: 81
diff changeset
112 List<Direction<TreeNode>> list = List.nil();
fb1dc448ac8c delete <T extends TreeNode>
one
parents: 81
diff changeset
113 List<Direction<TreeNode>> newList = list.cons(d);
43
1c91c4357228 added traverser test
Shoshi TAMAKI
parents: 41
diff changeset
114
1c91c4357228 added traverser test
Shoshi TAMAKI
parents: 41
diff changeset
115 return newList;
1c91c4357228 added traverser test
Shoshi TAMAKI
parents: 41
diff changeset
116 }
1c91c4357228 added traverser test
Shoshi TAMAKI
parents: 41
diff changeset
117
81
715a9fbf02fc remove <T> many source
one
parents: 68
diff changeset
118 private <T extends TreeNode> Either<Error,List<Direction<TreeNode>>> _accept(final T _current,final int _pos,Evaluator _evaluator)
26
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
119 {
86
fb1dc448ac8c delete <T extends TreeNode>
one
parents: 81
diff changeset
120 Children chs = _current.getChildren();
81
715a9fbf02fc remove <T> many source
one
parents: 68
diff changeset
121 Either<Error,List<Direction<TreeNode>>> either = _traverse(chs,_evaluator,0);
26
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
122 if(either.isA()){
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
123 return either;
10
Shoshi TAMAKI
parents:
diff changeset
124 }
Shoshi TAMAKI
parents:
diff changeset
125
81
715a9fbf02fc remove <T> many source
one
parents: 68
diff changeset
126 List<Direction<TreeNode>> list = either.b();
715a9fbf02fc remove <T> many source
one
parents: 68
diff changeset
127 Direction<TreeNode> d = new Direction<TreeNode>(){
28
Shoshi TAMAKI
parents: 26
diff changeset
128 @Override
Shoshi TAMAKI
parents: 26
diff changeset
129 public int getPosition()
Shoshi TAMAKI
parents: 26
diff changeset
130 {
Shoshi TAMAKI
parents: 26
diff changeset
131 return _pos;
Shoshi TAMAKI
parents: 26
diff changeset
132 }
Shoshi TAMAKI
parents: 26
diff changeset
133 @Override
Shoshi TAMAKI
parents: 26
diff changeset
134 public T getTarget()
Shoshi TAMAKI
parents: 26
diff changeset
135 {
Shoshi TAMAKI
parents: 26
diff changeset
136 return _current;
Shoshi TAMAKI
parents: 26
diff changeset
137 }
Shoshi TAMAKI
parents: 26
diff changeset
138 };
Shoshi TAMAKI
parents: 26
diff changeset
139
81
715a9fbf02fc remove <T> many source
one
parents: 68
diff changeset
140 List<Direction<TreeNode>> newList = list.cons(d);
26
075d6418e359 modified traverser
Shoshi TAMAKI
parents: 23
diff changeset
141 return DefaultEither.newB(newList);
10
Shoshi TAMAKI
parents:
diff changeset
142 }
Shoshi TAMAKI
parents:
diff changeset
143 }