# HG changeset patch # User Shoshi TAMAKI # Date 1355994557 -32400 # Node ID 703f0be5368a2406b68f44072aaa60ef26d3d0f3 # Parent 8d4cbd5a65258bffbb362e67ea416ebe358da321 added attribute cache diff -r 8d4cbd5a6525 -r 703f0be5368a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/Children.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/Children.java Thu Dec 20 17:18:47 2012 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/Children.java Thu Dec 20 18:09:17 2012 +0900 @@ -2,4 +2,5 @@ public interface Children extends Iterable { + public int size(); } diff -r 8d4cbd5a6525 -r 703f0be5368a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultChangeList.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultChangeList.java Thu Dec 20 18:09:17 2012 +0900 @@ -0,0 +1,55 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; + +import fj.data.List; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Tree; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeList; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.Operation; + +public class DefaultChangeList implements ChangeList +{ + private final ChangeList prev; + private final String uuid; + private final long revision; + + private final List operations; + private final Tree tree; + + public DefaultChangeList(Tree _tree,List _operations,String _uuid,long _revision,ChangeList _prev) + { + tree = _tree; + operations = _operations; + uuid = _uuid; + revision = _revision; + prev = _prev; + } + + @Override + public ChangeList prev() + { + return prev; + } + + @Override + public String uuid() + { + return uuid; + } + + @Override + public long revision() + { + return revision; + } + + @Override + public Iterable getOperations() + { + return operations; + } + + @Override + public Tree getTree() + { + return tree; + } +} diff -r 8d4cbd5a6525 -r 703f0be5368a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultChangeSet.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultChangeSet.java Thu Dec 20 17:18:47 2012 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; - -import fj.data.List; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Tree; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TraversableTree; - -public class DefaultChangeSet implements ChangeSet -{ - private final ChangeSet prev; - private final String uuid; - private final long revision; - - private final List commands; - private final Tree tree; - - public DefaultChangeSet(Tree _tree,List _commands,String _uuid,long _revision,ChangeSet _prev) - { - tree = _tree; - commands = _commands; - uuid = _uuid; - revision = _revision; - prev = _prev; - } - - @Override - public ChangeSet prev() - { - return prev; - } - - @Override - public String uuid() - { - return uuid; - } - - @Override - public long revision() - { - return revision; - } - - @Override - public Iterable getCommands() - { - return commands; - } - - @Override - public Tree getTree() - { - return tree; - } -} diff -r 8d4cbd5a6525 -r 703f0be5368a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultChildren.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultChildren.java Thu Dec 20 17:18:47 2012 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultChildren.java Thu Dec 20 18:09:17 2012 +0900 @@ -24,6 +24,12 @@ children = _children; } + @Override + public int size() + { + return children.length(); + } + public DefaultChildren add(DefaultNode _newNode) { return new DefaultChildren(children.snoc(_newNode)); diff -r 8d4cbd5a6525 -r 703f0be5368a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java Thu Dec 20 17:18:47 2012 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java Thu Dec 20 18:09:17 2012 +0900 @@ -2,10 +2,9 @@ import java.nio.ByteBuffer; import java.util.Iterator; - import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Tree; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeList; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TraversableTree; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditResult; @@ -24,12 +23,12 @@ public class DefaultTreeEditor implements TreeEditor { private final TreeRepository repo; - private final ChangeSet tip; + private final ChangeList tip; public DefaultTreeEditor(TreeRepository _repo) { repo = _repo; - tip = _repo.getCurrentChangeSet(); + tip = _repo.getCurrentChangeList(); } @Override diff -r 8d4cbd5a6525 -r 703f0be5368a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/ModifiedTreeEditorImpl.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/ModifiedTreeEditorImpl.java Thu Dec 20 17:18:47 2012 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/ModifiedTreeEditorImpl.java Thu Dec 20 18:09:17 2012 +0900 @@ -3,12 +3,10 @@ import java.nio.ByteBuffer; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Tree; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Result; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TraversableTree; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeTransformer; -class ModifiedTreeEditorImpl implements TreeEditor +class ModifiedTreeEditor implements TreeEditor { @Override diff -r 8d4cbd5a6525 -r 703f0be5368a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeRepository.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeRepository.java Thu Dec 20 17:18:47 2012 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeRepository.java Thu Dec 20 18:09:17 2012 +0900 @@ -1,33 +1,32 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; import java.util.concurrent.atomic.AtomicReference; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Constants; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.Operation; import fj.data.List; public class TreeRepository { - private final AtomicReference changeSet; + private final AtomicReference changeList; public TreeRepository() { - List emptyCommands = List.nil(); + List emptyCommands = List.nil(); - changeSet = new AtomicReference( - new DefaultChangeSet(DefaultTree.EMPTY,emptyCommands, + changeList = new AtomicReference( + new DefaultChangeList(DefaultTree.EMPTY,emptyCommands, Constants.DEFAULT_OWNER,Constants.DEFAULT_REVISION_START_NUMBER,null) ); } - public DefaultChangeSet getCurrentChangeSet() + public DefaultChangeList getCurrentChangeList() { - return changeSet.get(); + return changeList.get(); } - public boolean commitChangeSet(DefaultChangeSet _newChangeSet,DefaultChangeSet _currentChangeSet) + public boolean commitChangeList(DefaultChangeList _newChangeList,DefaultChangeList _currentChangeList) { - return changeSet.compareAndSet(_currentChangeSet,_newChangeSet); + return changeList.compareAndSet(_currentChangeList,_newChangeList); } } diff -r 8d4cbd5a6525 -r 703f0be5368a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/AppendChildAt.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/AppendChildAt.java Thu Dec 20 17:18:47 2012 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; - -public abstract class AppendChildAt implements Operation -{ - public Command getCommand() - { - return Command.APPEND_CHILD; - } - - public abstract int position(); -} diff -r 8d4cbd5a6525 -r 703f0be5368a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/AppendChildAtOperation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/AppendChildAtOperation.java Thu Dec 20 18:09:17 2012 +0900 @@ -0,0 +1,13 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; + +public abstract class AppendChildAtOperation implements Operation +{ + public Command getCommand() + { + return Command.APPEND_CHILD; + } + + public abstract int position(); +} diff -r 8d4cbd5a6525 -r 703f0be5368a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DeleteAttribute.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DeleteAttribute.java Thu Dec 20 17:18:47 2012 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; - -public abstract class DeleteAttribute implements Operation -{ - @Override - public Command getCommand() - { - return Command.DELETE_ATTRIBUTE; - } - - public abstract String getKey(); -} diff -r 8d4cbd5a6525 -r 703f0be5368a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DeleteAttributeOperation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DeleteAttributeOperation.java Thu Dec 20 18:09:17 2012 +0900 @@ -0,0 +1,14 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; + +public abstract class DeleteAttributeOperation implements Operation +{ + @Override + public Command getCommand() + { + return Command.DELETE_ATTRIBUTE; + } + + public abstract String getKey(); +} diff -r 8d4cbd5a6525 -r 703f0be5368a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DeleteChildAt.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DeleteChildAt.java Thu Dec 20 17:18:47 2012 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; - -public abstract class DeleteChildAt implements Operation -{ - @Override - public Command getCommand() - { - return Command.DELETE_CHILD; - } - - public abstract int position(); -} diff -r 8d4cbd5a6525 -r 703f0be5368a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DeleteChildAtOperation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DeleteChildAtOperation.java Thu Dec 20 18:09:17 2012 +0900 @@ -0,0 +1,14 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; + +public abstract class DeleteChildAtOperation implements Operation +{ + @Override + public Command getCommand() + { + return Command.DELETE_CHILD; + } + + public abstract int position(); +} diff -r 8d4cbd5a6525 -r 703f0be5368a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/SetAttribute.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/SetAttribute.java Thu Dec 20 17:18:47 2012 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations; - -import java.nio.ByteBuffer; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; - -public abstract class SetAttribute implements Operation -{ - @Override - public Command getCommand() - { - return Command.SET_ATTRIBUTE; - } - - public abstract String getKey(); - public abstract ByteBuffer getValue(); -} diff -r 8d4cbd5a6525 -r 703f0be5368a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/SetAttributeOperation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/SetAttributeOperation.java Thu Dec 20 18:09:17 2012 +0900 @@ -0,0 +1,16 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations; + +import java.nio.ByteBuffer; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; + +public abstract class SetAttributeOperation implements Operation +{ + @Override + public Command getCommand() + { + return Command.SET_ATTRIBUTE; + } + + public abstract String getKey(); + public abstract ByteBuffer getValue(); +} diff -r 8d4cbd5a6525 -r 703f0be5368a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DefaultEditableAttributes.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DefaultEditableAttributes.java Thu Dec 20 17:18:47 2012 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DefaultEditableAttributes.java Thu Dec 20 18:09:17 2012 +0900 @@ -3,31 +3,66 @@ import java.nio.ByteBuffer; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Attributes; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DeleteAttributeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.Operation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.SetAttributeOperation; public class DefaultEditableAttributes implements EditableAttributes { + private Node target; private Attributes attrs; + private EditCache cache; - public DefaultEditableAttributes(Attributes _attrs,EditCache _cache) + public DefaultEditableAttributes(Node _target,EditCache _cache) { - attrs = _attrs; + target = _target; + attrs = _target.getAttributes(); + cache = _cache; } @Override public ByteBuffer get(String _key) { - return null; + Operation op = cache.getAttribute(_key); + + if(op == null){ + return attrs.get(_key); + } + + Command c = op.getCommand(); + + if(c == Command.SET_ATTRIBUTE){ + SetAttributeOperation saop = (SetAttributeOperation)op; + String key = saop.getKey(); + if(key.equals(_key)){ + return saop.getValue(); + } + throw new IllegalStateException("fail key.equals(_key)"); + }else if(c == Command.DELETE_ATTRIBUTE){ + DeleteAttributeOperation daop = (DeleteAttributeOperation)op; + String key = daop.getKey(); + if(key.equals(_key)){ + return null; + } + throw new IllegalStateException("fail key.equals(_key)"); + } + + throw new IllegalStateException("fail unknown command" + c); } @Override public EditableNode delete(String _key) { - return null; + EditCache newCache = cache.deleteAttribute(_key); + return new DefaultEditableNode(target,newCache); } @Override public EditableNode put(String _key, ByteBuffer _value) { - return null; + EditCache newCache = cache.setAttribute(_key,_value); + return new DefaultEditableNode(target,newCache); } } diff -r 8d4cbd5a6525 -r 703f0be5368a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DefaultEditableChildren.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DefaultEditableChildren.java Thu Dec 20 18:09:17 2012 +0900 @@ -0,0 +1,46 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; + +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.Operation; + +public class DefaultEditableChildren implements EditableChildren +{ + private final Node target; + private final EditCache cache; + + public DefaultEditableChildren(Node _target,EditCache _cache) + { + target = _target; + cache = _cache; + } + + @Override + public int size() + { + return 0; + } + + @Override + public Iterator iterator() + { + return null; + } + + @Override + public EditableNode addNewChildAt(int _pos) + { + AppendChildAtOperation op = new AppendChildAtOperaiton(){ + + }; + + return null; + } + + @Override + public EditableNode deleteChildAt(int _pos) + { + return null; + } +} \ No newline at end of file diff -r 8d4cbd5a6525 -r 703f0be5368a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DefaultEditableNode.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DefaultEditableNode.java Thu Dec 20 17:18:47 2012 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DefaultEditableNode.java Thu Dec 20 18:09:17 2012 +0900 @@ -4,19 +4,29 @@ public class DefaultEditableNode implements EditableNode { + private final Node target; + private final EditCache cache; + public DefaultEditableNode(Node _target) { + this(_target,new EditCache()); + } + + public DefaultEditableNode(Node _target,EditCache _cache) + { + target = _target; + cache = _cache; } @Override public EditableAttributes getAttributes() { - return null; + return new DefaultEditableAttributes(target,cache); } @Override public EditableChildren getChildren() { - return null; + return new DefaultEditableChildren(target,cache); } } diff -r 8d4cbd5a6525 -r 703f0be5368a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/EditCache.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/EditCache.java Thu Dec 20 17:18:47 2012 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/EditCache.java Thu Dec 20 18:09:17 2012 +0900 @@ -1,15 +1,15 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; import java.nio.ByteBuffer; - import fj.Ord; import fj.data.List; import fj.data.Option; import fj.data.TreeMap; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.AppendChildAtOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DeleteAttributeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DeleteChildAtOperation; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.Operation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.Parameter; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.SetAttributeOperation; public class EditCache { @@ -33,35 +33,66 @@ public EditCache setAttribute(final String _key,final ByteBuffer _value) { - Operation op = new Operation(){ + SetAttributeOperation op = new SetAttributeOperation(){ @Override - public Command getCommand(){ - return Command.PUT_ATTRIBUTE; + public String getKey(){ + return _key; + } + @Override + public ByteBuffer getValue(){ + return _value; } - + }; + + TreeMap newAttrCache = attrCache.set(_key,op); + List newOperations = operations.snoc(op); + + return new EditCache(newOperations,newAttrCache,childrenCache); + } + + public EditCache deleteAttribute(final String _key) + { + DeleteAttributeOperation op = new DeleteAttributeOperation(){ @Override - public T getParameter(Parameter _param){ - if(_param == jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.SetAttribute.KEY){ - return _key; - } - return ; + public String getKey(){ + return _key; } }; - } - - public EditCache deleteAttribute(String _key) - { + TreeMap newAttrCache = attrCache.set(_key,op); + List newOperations = operations.snoc(op); + + return new EditCache(newOperations,newAttrCache,childrenCache); } - public EditCache appendChildAt(int _pos) + public EditCache appendChildAt(final int _pos) { + AppendChildAtOperation op = new AppendChildAtOperation(){ + @Override + public int position(){ + return _pos; + } + }; + List newOperations = operations.snoc(op); + List newChildrenCache = childrenCache.snoc(op); + + return new EditCache(newOperations,attrCache,newChildrenCache); } - public EditCache deleteChildAt(int _pos) + public EditCache deleteChildAt(final int _pos) { + DeleteChildAtOperation op = new DeleteChildAtOperation(){ + @Override + public int position(){ + return _pos; + } + }; + List newOperations = operations.snoc(op); + List newChildrenCache = childrenCache.snoc(op); + + return new EditCache(newOperations,attrCache,newChildrenCache); } public Operation getAttribute(String _key)