Mercurial > hg > Database > jungle-sharp
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle-main/traverser/DefaultTraverser.cs Mon Nov 07 01:05:24 2016 +0900 @@ -0,0 +1,162 @@ +using System.Collections.Generic; +using System.Collections; +using UnityEngine; +using System; +// yet write. +public class DefaultTraverser : Traverser { + + + public Either<Error, Traversal> traverse(TreeNode _root, Evaluator _evaluator) { + // 無名クラスを書いてない + Children warper = new InnerChildren(_root, _evaluator); + + Children chs = warper; + Either<Error, List<Direction<TreeNode>>> ret = _traverse(chs, _evaluator, -1); + + if (ret.isA ()) { + return DefaultEither<Error, Traversal>.newA (ret.a ()); + } + + List<Direction<TreeNode>> list = ret.b (); + IEnumerator<Direction<TreeNode>> iterable = list.iterator (); + TreeNode destination = ret.b ().headList ().getTarget (); + + Traversal traversal = new InnerTraversal (iterable, destination); + + return DefaultEither<Error, Traversal>.newB (traversal); + + } + + + private Either<Error, List<Direction<TreeNode>>> _traverse(Children _chs, Evaluator _evaluator, int _pos) { + int pos = _pos; + TreeNode ch; + for (int i = 0; i < _chs.size(); i++) { + Either<Error,TreeNode> either = _chs.at(i); + if (either.isA ()) { + break; + } + + ch = either.b(); + Evaluation e = _evaluator.evaluate (ch, pos); + Result r = e.results(); + + if (r == Result.ACCEPT) { + return _accept (ch, pos, e.evaluators ()); + } + + if (r == Result.GOAL) { + return DefaultEither<Error,List<Direction<TreeNode>>>.newB(_goal(ch, pos)); + } + + if (r == Result.BREAK) { + break; + } + + if (r == Result.CONTINUE) { + pos++; + continue; + } + + return DefaultEither<Error, List<Direction<TreeNode>>>.newA (TraverserError.UNDEFINED_OPERATOR); + } + return DefaultEither<Error, List<Direction<TreeNode>>>.newA (TraverserError.PATH_NOT_FOUND); + } + + + private List<Direction<TreeNode>> _goal( TreeNode _current, int _pos) { + Direction<TreeNode> d = new InnerDirection<TreeNode> (_pos, _current); + + List<Direction<TreeNode>> list = new List<Direction<TreeNode>> (); + List<Direction<TreeNode>> newList = list.addLast (d); + + return newList; + } + + + private Either<Error, List<Direction<TreeNode>>> _accept(TreeNode _current, int _pos,Evaluator _evaluator) + { + Children chs = _current.getChildren (); + Either<Error, List<Direction<TreeNode>>> either = _traverse (chs, _evaluator, 0); + if (either.isA ()) { + return either; + } + List<Direction<TreeNode>> list = either.b (); + Direction<TreeNode> d = new InnerDirection<TreeNode> (_pos, _current); + + List<Direction<TreeNode>> newList = list.addLast (d); + return DefaultEither<Error,List<Direction<TreeNode>>>.newB (newList); + } + + public class InnerTraversal : Traversal{ + IEnumerator<Direction<TreeNode>> iterable; + TreeNode destination; + + IEnumerator IEnumerable.GetEnumerator() + { + return this.GetEnumerator(); + } + + public IEnumerator<Direction<TreeNode>> GetEnumerator() + { + return iterable; + } + + + public InnerTraversal(IEnumerator<Direction<TreeNode>> _iterable, TreeNode _distination){ + this.iterable = _iterable; + this.destination = _distination; + } + + + public TreeNode destinations() { + return destination; + } + + } + + public class InnerChildren : Children{ + TreeNode root; + Evaluator evaluator; + + public InnerChildren(TreeNode _root, Evaluator _evaluator){ + this.root = _root; + this.evaluator = _evaluator; + } + + public IEnumerator<TreeNode> iterator() { + List<TreeNode> list = new List<TreeNode> (); + return list.addLast (root).iterator (); + } + + public int size() { + return 1; + } + + public Either<Error, TreeNode> at(int _pos) { + if (_pos != 0) { + return DefaultEither<Error, TreeNode>.newA (NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + return DefaultEither<Error, TreeNode>.newB (root); + } + } + + public class InnerDirection<TreeNode> : Direction<TreeNode>{ + int pos; + TreeNode current; + + public InnerDirection(int _pos, TreeNode _current) { + this.pos = _pos; + this.current = _current; + } + + public int getPosition() { + return pos; + } + + public TreeNode getTarget(){ + return current; + } + } + +} \ No newline at end of file