Mercurial > hg > Members > tatsuki > bench > jungle-core
view src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/DefaultTraverser.java @ 81:715a9fbf02fc
remove <T> many source
author | one |
---|---|
date | Sun, 31 Aug 2014 07:46:30 +0900 |
parents | 240a385bf79d |
children | fb1dc448ac8c |
line wrap: on
line source
package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser; import java.util.Iterator; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditorError; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; import fj.data.List; public class DefaultTraverser implements Traverser { @Override public <T extends TreeNode> Either<Error,Traversal<TreeNode>> traverse(final T _root,Evaluator _evaluator) { Children<T> wrapper = new Children<T>(){ @Override public Iterator<T> iterator(){ List<T> list = List.nil(); return list.cons(_root).iterator(); } @Override public int size(){ return 1; } @Override public Either<Error,T> at(int _pos){ if(_pos != 0){ return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); } return DefaultEither.newB(_root); } }; //Children<T> chs = _root.getChildren(); Children<T> chs = wrapper; Either<Error,List<Direction<TreeNode>>> ret = _traverse(chs,_evaluator,-1); if(ret.isA()){ return DefaultEither.newA(ret.a()); } List<Direction<TreeNode>> list = ret.b(); final Iterable<Direction<TreeNode>> iterable = list; final TreeNode destination = ret.b().last().getTarget(); Traversal<TreeNode> traversal = new Traversal<TreeNode>(){ @Override public Iterator<Direction<TreeNode>> iterator(){ return iterable.iterator(); } @Override public TreeNode destination(){ return destination; } }; return DefaultEither.newB(traversal); } private <T extends TreeNode> Either<Error,List<Direction<TreeNode>>> _traverse(Children<T> _chs,Evaluator _evaluator,int _pos) { int pos = _pos; for(TreeNode ch : _chs){ Evaluation e = _evaluator.evaluate(ch,pos); Result r = e.result(); if(r == Result.ACCEPT){ return _accept(ch,pos,e.evaluator()); } if(r == Result.GOAL){ return DefaultEither.newB(_goal(ch,pos)); } if(r == Result.BREAK){ break; } if(r == Result.CONTINUE){ pos ++; continue; } return DefaultEither.newA(TraverserError.UNDEFINED_OPERATOR); } return DefaultEither.newA(TraverserError.PATH_NOT_FOUND); } private <T extends TreeNode> List<Direction<T>> _goal(final T _current,final int _pos) { Direction<T> d = new Direction<T>(){ @Override public int getPosition() { return _pos; } @Override public T getTarget() { return _current; } }; List<Direction<T>> list = List.nil(); List<Direction<T>> newList = list.cons(d); return newList; } private <T extends TreeNode> Either<Error,List<Direction<TreeNode>>> _accept(final T _current,final int _pos,Evaluator _evaluator) { Children<TreeNode> 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 Direction<TreeNode>(){ @Override public int getPosition() { return _pos; } @Override public T getTarget() { return _current; } }; List<Direction<TreeNode>> newList = list.cons(d); return DefaultEither.newB(newList); } }