37
|
1 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction;
|
|
2
|
|
3 import java.nio.ByteBuffer;
|
|
4 import java.util.Iterator;
|
71
|
5
|
37
|
6 import fj.P2;
|
|
7 import fj.data.List;
|
|
8 import fj.data.TreeMap;
|
|
9 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultAttributes;
|
|
10 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultChildren;
|
|
11 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode;
|
52
|
12 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNodeChildren;
|
37
|
13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditorError;
|
|
14 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
|
|
15 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
|
|
16 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
|
|
17 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter;
|
|
18
|
52
|
19 public class DefaultTreeNodeChildren implements TreeNodeChildren<DefaultTreeNode>
|
37
|
20 {
|
39
|
21 public static void main(String _args[])
|
|
22 {
|
|
23 List<Integer> list = List.range(0,5);
|
41
|
24 P2<List<Integer>, List<Integer>> split = list.splitAt(0);
|
39
|
25 System.out.println(split._1().length());
|
|
26 System.out.println(split._2().length());
|
|
27
|
|
28 }
|
|
29
|
71
|
30 public List<DefaultTreeNode> children;
|
|
31 public TreeMap<String,ByteBuffer> attrs;
|
37
|
32
|
71
|
33 public DefaultTreeNodeChildren(List<DefaultTreeNode> _children,TreeMap<String,ByteBuffer> _attrs)
|
37
|
34 {
|
71
|
35 children = _children;
|
|
36 attrs = _attrs;
|
37
|
37 }
|
|
38
|
|
39 private boolean boundaryCheck(int _pos)
|
|
40 {
|
71
|
41 int size = children.length();
|
39
|
42 if(size < _pos){
|
37
|
43 return false;
|
|
44 }
|
|
45
|
|
46 return true;
|
|
47 }
|
|
48
|
|
49 @Override
|
52
|
50 public Either<Error,DefaultTreeNode> addNewChildAt(int _pos)
|
37
|
51 {
|
39
|
52 if(!boundaryCheck(_pos) || _pos < 0){
|
37
|
53 return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS);
|
|
54 }
|
|
55
|
|
56
|
|
57
|
71
|
58 P2<List<DefaultTreeNode>,List<DefaultTreeNode>> split = children.splitAt(_pos);
|
|
59 List<DefaultTreeNode> newChildren = split._1().snoc(new DefaultTreeNode()).append(split._2());
|
|
60 DefaultTreeNode newNode = new DefaultTreeNode(newChildren,attrs);
|
37
|
61
|
71
|
62 return DefaultEither.newB(newNode);
|
37
|
63 }
|
|
64
|
|
65 @Override
|
52
|
66 public Either<Error,DefaultTreeNode> deleteChildAt(int _pos)
|
37
|
67 {
|
39
|
68 if(!boundaryCheck(_pos) || _pos < 0 || size() == 0){
|
37
|
69 return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS);
|
|
70 }
|
71
|
71
|
|
72 P2<List<DefaultTreeNode>,List<DefaultTreeNode>> split = children.splitAt(_pos);
|
|
73 List<DefaultTreeNode> newChildren = split._1().append(split._2().tail());
|
37
|
74
|
|
75
|
71
|
76 DefaultTreeNode newNode = new DefaultTreeNode(newChildren,attrs);
|
37
|
77
|
71
|
78 return DefaultEither.newB(newNode);
|
37
|
79 }
|
|
80
|
|
81 @Override
|
|
82 public int size()
|
|
83 {
|
71
|
84 return children.length();
|
37
|
85 }
|
|
86
|
|
87 @Override
|
52
|
88 public Iterator<DefaultTreeNode> iterator()
|
37
|
89 {
|
71
|
90 return children.iterator();
|
37
|
91 }
|
|
92
|
|
93 @Override
|
52
|
94 public Either<Error,DefaultTreeNode> replaceNode(int _pos,DefaultTreeNode _replacement)
|
37
|
95 {
|
71
|
96 int size = children.length();
|
41
|
97 if(!(0 <= _pos && _pos < size)){
|
37
|
98 return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS);
|
|
99 }
|
71
|
100 DefaultTreeNode replacement = _replacement;
|
37
|
101
|
71
|
102 P2<List<DefaultTreeNode>,List<DefaultTreeNode>> split = children.splitAt(_pos + 1);
|
|
103 List<DefaultTreeNode> init = split._1().reverse().tail().reverse();
|
|
104 List<DefaultTreeNode> newInit = init.snoc(replacement);
|
|
105 List<DefaultTreeNode> newList = newInit.append(split._2());
|
39
|
106
|
71
|
107 return DefaultEither.newB(new DefaultTreeNode(newList,attrs));
|
37
|
108 }
|
41
|
109
|
|
110 @Override
|
52
|
111 public Either<Error,DefaultTreeNode> at(int _pos)
|
41
|
112 {
|
71
|
113 DefaultTreeNode Node = children.index(_pos);
|
|
114 if(Node == null){
|
41
|
115 return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS);
|
|
116 }
|
|
117
|
71
|
118 return DefaultEither.newB(Node);
|
41
|
119 }
|
|
120
|
|
121 @Override
|
52
|
122 public Either<Error,DefaultTreeNode> addNewChildAt(int _pos,DefaultTreeNode _newChild)
|
41
|
123 {
|
|
124 if(!boundaryCheck(_pos) || _pos < 0){
|
|
125 return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS);
|
|
126 }
|
|
127
|
|
128
|
71
|
129 P2<List<DefaultTreeNode>,List<DefaultTreeNode>> split = children.splitAt(_pos);
|
|
130 List<DefaultTreeNode> newChildren = split._1().snoc(_newChild).append(split._2());
|
|
131 DefaultTreeNode newNode = new DefaultTreeNode(newChildren,attrs);
|
41
|
132
|
71
|
133 return DefaultEither.newB(newNode);
|
41
|
134 }
|
37
|
135 }
|