Mercurial > hg > Members > tatsuki > bench > jungle-core
view src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/DefaultTraverser.java @ 41:ed6737db637a
added tests
author | Shoshi TAMAKI |
---|---|
date | Tue, 29 Jan 2013 23:42:54 +0900 |
parents | 3dfa0be90a0d |
children | 1c91c4357228 |
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.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 TraversableNode<T>> Either<Error,Traversal<T>> 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); } }; Either<Error,List<Direction<T>>> ret = _traverse(wrapper,_evaluator); if(ret.isA()){ return DefaultEither.newA(ret.a()); } final Iterable<Direction<T>> iterable = ret.b(); final T destination = ret.b().last().getTarget(); Traversal<T> traversal = new Traversal<T>(){ @Override public Iterator<Direction<T>> iterator(){ return iterable.iterator(); } @Override public T destination(){ return destination; } }; return DefaultEither.newB(traversal); } private <T extends TraversableNode<T>> Either<Error,List<Direction<T>>> _traverse(Children<T> _chs,Evaluator _evaluator) { int pos = 0; for(T 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.BREAK){ List<Direction<T>> nil = List.nil(); return DefaultEither.newB(nil); } if(r == Result.CONTINUE){ pos ++; continue; } return DefaultEither.newA(TraverserError.UNDEFINED_OPERATOR); } return DefaultEither.newA(TraverserError.PATH_NOT_FOUND); } private <T extends TraversableNode<T>> Either<Error,List<Direction<T>>> _accept(final T _current,final int _pos,Evaluator _evaluator) { Children<T> chs = _current.getChildren(); Either<Error,List<Direction<T>>> either = _traverse(chs,_evaluator); if(either.isA()){ return either; } List<Direction<T>> list = either.b(); Direction<T> d = new Direction<T>(){ @Override public int getPosition() { return _pos; } @Override public T getTarget() { return _current; } }; List<Direction<T>> newList = list.cons(d); return DefaultEither.newB(newList); } }