annotate src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/store/impl/DefaultTreeEditor.cs @ 7:02b2ab7bffe6

fix
author Kazuma
date Tue, 27 Sep 2016 18:36:05 +0900
parents dec15de2c6ff
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
1 using UnityEngine;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
2 using System.Collections;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
3 using System.Collections.Generic;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
4 public class DefaultTreeEditor : TreeEditor {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
5 private Traverser traverser;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
6 public DefaultTreeEditor(Traverser traverser){
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
7 this.traverser = traverser;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
8 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
9
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
10 public Either<Error,LoggingNode> edit(TreeNode root,NodePath path, NodeEditor editor){
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
11 DefaultEvaluator e = new DefaultEvaluator (path);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
12 Either<Error, Traversal> either = traverser.traverse (root, e);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
13
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
14 if (either.isA ()) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
15 return DefaultEither<Error, LoggingNode>.newA (either.a ());
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
16 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
17 Traversal t = either.b ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
18 return clone (t, editor);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
19 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
20
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
21 private Either<Error, LoggingNode> clone(Traversal t, NodeEditor editor){
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
22 List<Direction<TreeNode>> path = new List<Direction<TreeNode>> ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
23
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
24 foreach (Direction<TreeNode> direction in t) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
25 path = path.addLast (direction);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
26 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
27
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
28 Direction<TreeNode> targetDirection = path.headList ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
29 TreeNode target = targetDirection.getTarget ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
30 Either<Error, LoggingNode> either = editor.edit (target);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
31 if (either.isA ()) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
32 return DefaultEither<Error, LoggingNode>.newA (either.a ());
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
33 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
34
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
35 LoggingNode newWrap = either.b ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
36
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
37 int pos = targetDirection.getPosition ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
38 TreeNode child = newWrap.getWrap ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
39
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
40 foreach (Direction<TreeNode> parentDirection in path.deleteHead()) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
41 TreeNodeChildren chs = parentDirection.getTarget ().getChildren ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
42
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
43 Either<Error, TreeNode> ret = chs.replaceNode (pos, child);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
44 if (ret.isA ()) {
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
45 return DefaultEither<Error, LoggingNode>.newA (ret.a ());
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
46 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
47
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
48 child = ret.b ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
49 pos = parentDirection.getPosition ();
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
50 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
51
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
52 TreeNode newRoot = child;
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
53 LoggingNode logNode = editor.wrap (newRoot, newWrap.getOperationLog ());
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
54 return DefaultEither<Error, LoggingNode>.newB (logNode);
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
55
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
56 }
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
57
dec15de2c6ff first commit
Kazuma
parents:
diff changeset
58 }