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