Mercurial > hg > Members > tatsuki > bench > jungle-core
view src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingChildren.java @ 52:8c6ff361b68a
sleepy
author | Shoshi TAMAKI |
---|---|
date | Fri, 08 Feb 2013 03:50:21 +0900 |
parents | bc119c52d5cc |
children | ed890dcb673e |
line wrap: on
line source
package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger; import java.util.Iterator; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.AppendChildAtOperation; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DeleteChildAtOperation; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableChildren; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; 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 jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter; public class LoggingChildren<T extends EditableNode<T>> implements EditableChildren<LoggingNode<T>> { private final T wrap; private final OperationLog log; public LoggingChildren(T _wrap,OperationLog _log) { wrap = _wrap; log = _log; } @Override public int size() { EditableChildren<T> children = wrap.getChildren(); return children.size(); } @Override public Iterator<Node> iterator() { EditableChildren<T> children = wrap.getChildren(); return children.iterator(); } public Either<Error,LoggingNode<T>> edit(NodeOperation _op) { Either<Error,T> either = _op.invoke(wrap); if(either.isA()){ return DefaultEither.newA(either.a()); } T newWrap = either.b(); OperationLog newLog = log.add(_op); LoggingNode<T> newLoggingNode = new LoggingNode<T>(newWrap,newLog); return DefaultEither.newB(newLoggingNode); } @Override public Either<Error,LoggingNode<T>> addNewChildAt(final int _pos) { NodeOperation addNewChildAt = new AppendChildAtOperation(_pos); return edit(addNewChildAt); } @Override public Either<Error,LoggingNode<T>> deleteChildAt(final int _pos) { NodeOperation deleteChildAt = new DeleteChildAtOperation(_pos); return edit(deleteChildAt); } @Override public Either<Error,Node> at(int _pos) { EditableChildren<T> children = wrap.getChildren(); Either<Error,Node> either = children.at(_pos); if(either.isA()){ return DefaultEither.newA(either.a()); } Node node = either.b(); return DefaultEither.newB(node); } }