comparison src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle-main/traverser/DefaultTraverser.cs @ 17:01a08cf4b2d9

Liq Files
author Kazuma
date Mon, 07 Nov 2016 01:05:24 +0900
parents abe0c247f5a5
children
comparison
equal deleted inserted replaced
16:8f1ce942abfc 17:01a08cf4b2d9
1 using System.Collections.Generic;
2 using System.Collections;
3 using UnityEngine;
4 using System;
5 // yet write.
6 public class DefaultTraverser : Traverser {
7
8
9 public Either<Error, Traversal> traverse(TreeNode _root, Evaluator _evaluator) {
10 // 無名クラスを書いてない
11 Children warper = new InnerChildren(_root, _evaluator);
12
13 Children chs = warper;
14 Either<Error, List<Direction<TreeNode>>> ret = _traverse(chs, _evaluator, -1);
15
16 if (ret.isA ()) {
17 return DefaultEither<Error, Traversal>.newA (ret.a ());
18 }
19
20 List<Direction<TreeNode>> list = ret.b ();
21 IEnumerator<Direction<TreeNode>> iterable = list.iterator ();
22 TreeNode destination = ret.b ().headList ().getTarget ();
23
24 Traversal traversal = new InnerTraversal (iterable, destination);
25
26 return DefaultEither<Error, Traversal>.newB (traversal);
27
28 }
29
30
31 private Either<Error, List<Direction<TreeNode>>> _traverse(Children _chs, Evaluator _evaluator, int _pos) {
32 int pos = _pos;
33 TreeNode ch;
34 for (int i = 0; i < _chs.size(); i++) {
35 Either<Error,TreeNode> either = _chs.at(i);
36 if (either.isA ()) {
37 break;
38 }
39
40 ch = either.b();
41 Evaluation e = _evaluator.evaluate (ch, pos);
42 Result r = e.results();
43
44 if (r == Result.ACCEPT) {
45 return _accept (ch, pos, e.evaluators ());
46 }
47
48 if (r == Result.GOAL) {
49 return DefaultEither<Error,List<Direction<TreeNode>>>.newB(_goal(ch, pos));
50 }
51
52 if (r == Result.BREAK) {
53 break;
54 }
55
56 if (r == Result.CONTINUE) {
57 pos++;
58 continue;
59 }
60
61 return DefaultEither<Error, List<Direction<TreeNode>>>.newA (TraverserError.UNDEFINED_OPERATOR);
62 }
63 return DefaultEither<Error, List<Direction<TreeNode>>>.newA (TraverserError.PATH_NOT_FOUND);
64 }
65
66
67 private List<Direction<TreeNode>> _goal( TreeNode _current, int _pos) {
68 Direction<TreeNode> d = new InnerDirection<TreeNode> (_pos, _current);
69
70 List<Direction<TreeNode>> list = new List<Direction<TreeNode>> ();
71 List<Direction<TreeNode>> newList = list.addLast (d);
72
73 return newList;
74 }
75
76
77 private Either<Error, List<Direction<TreeNode>>> _accept(TreeNode _current, int _pos,Evaluator _evaluator)
78 {
79 Children chs = _current.getChildren ();
80 Either<Error, List<Direction<TreeNode>>> either = _traverse (chs, _evaluator, 0);
81 if (either.isA ()) {
82 return either;
83 }
84 List<Direction<TreeNode>> list = either.b ();
85 Direction<TreeNode> d = new InnerDirection<TreeNode> (_pos, _current);
86
87 List<Direction<TreeNode>> newList = list.addLast (d);
88 return DefaultEither<Error,List<Direction<TreeNode>>>.newB (newList);
89 }
90
91 public class InnerTraversal : Traversal{
92 IEnumerator<Direction<TreeNode>> iterable;
93 TreeNode destination;
94
95 IEnumerator IEnumerable.GetEnumerator()
96 {
97 return this.GetEnumerator();
98 }
99
100 public IEnumerator<Direction<TreeNode>> GetEnumerator()
101 {
102 return iterable;
103 }
104
105
106 public InnerTraversal(IEnumerator<Direction<TreeNode>> _iterable, TreeNode _distination){
107 this.iterable = _iterable;
108 this.destination = _distination;
109 }
110
111
112 public TreeNode destinations() {
113 return destination;
114 }
115
116 }
117
118 public class InnerChildren : Children{
119 TreeNode root;
120 Evaluator evaluator;
121
122 public InnerChildren(TreeNode _root, Evaluator _evaluator){
123 this.root = _root;
124 this.evaluator = _evaluator;
125 }
126
127 public IEnumerator<TreeNode> iterator() {
128 List<TreeNode> list = new List<TreeNode> ();
129 return list.addLast (root).iterator ();
130 }
131
132 public int size() {
133 return 1;
134 }
135
136 public Either<Error, TreeNode> at(int _pos) {
137 if (_pos != 0) {
138 return DefaultEither<Error, TreeNode>.newA (NodeEditorError.INDEX_OUT_OF_BOUNDS);
139 }
140 return DefaultEither<Error, TreeNode>.newB (root);
141 }
142 }
143
144 public class InnerDirection<TreeNode> : Direction<TreeNode>{
145 int pos;
146 TreeNode current;
147
148 public InnerDirection(int _pos, TreeNode _current) {
149 this.pos = _pos;
150 this.current = _current;
151 }
152
153 public int getPosition() {
154 return pos;
155 }
156
157 public TreeNode getTarget(){
158 return current;
159 }
160 }
161
162 }