43
|
1 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl;
|
|
2
|
|
3 import java.util.Iterator;
|
|
4
|
44
|
5 import fj.F;
|
43
|
6 import fj.data.List;
|
|
7 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
|
|
8 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair;
|
|
9
|
|
10 public class DefaultNodePath implements NodePath
|
|
11 {
|
|
12 private final List<Integer> path;
|
|
13
|
104
|
14 public static void main(String args[])
|
43
|
15 {
|
|
16 DefaultNodePath p = new DefaultNodePath();
|
|
17 p = p.add(1).add(2).add(3).add(4);
|
|
18 System.out.println(p.toString());
|
|
19 }
|
|
20
|
|
21 public DefaultNodePath()
|
|
22 {
|
44
|
23 path = List.list(-1);
|
43
|
24 }
|
|
25
|
104
|
26 private DefaultNodePath(List<Integer> path)
|
43
|
27 {
|
104
|
28 this.path = path;
|
43
|
29 }
|
|
30
|
|
31 @Override
|
|
32 public Iterator<Integer> iterator()
|
|
33 {
|
|
34 return path.iterator();
|
|
35 }
|
|
36
|
|
37 @Override
|
104
|
38 public DefaultNodePath add(int pos)
|
43
|
39 {
|
104
|
40 List<Integer> newPath = path.snoc(pos);
|
43
|
41 return new DefaultNodePath(newPath);
|
|
42 }
|
|
43
|
|
44 @Override
|
|
45 public Pair<Integer, NodePath> pop()
|
|
46 {
|
|
47 Integer head = path.head();
|
|
48 List<Integer> tail = path.tail();
|
|
49
|
|
50 return new Pair<Integer,NodePath>(head,new DefaultNodePath(tail));
|
|
51 }
|
|
52
|
|
53 @Override
|
135
|
54 public Pair<Integer,NodePath> last(){
|
|
55 Integer last = path.last();
|
|
56 List<Integer> list = path.reverse().tail().reverse();
|
|
57 return new Pair<Integer,NodePath>(last,new DefaultNodePath(list));
|
|
58 }
|
|
59
|
|
60 @Override
|
43
|
61 public String toString()
|
|
62 {
|
|
63 return path.toString();
|
|
64 }
|
|
65
|
|
66 @Override
|
|
67 public int size()
|
|
68 {
|
|
69 return path.length();
|
|
70 }
|
44
|
71
|
|
72 public List<DefaultNodePath> inits()
|
|
73 {
|
|
74 List<List<Integer>> inits = path.inits();
|
|
75 inits = inits.filter(new F<List<Integer>,Boolean>(){
|
|
76 @Override
|
104
|
77 public Boolean f(List<Integer> init){
|
|
78 return init.length() != 0;
|
44
|
79 }
|
|
80 });
|
|
81
|
|
82 return inits.map(new F<List<Integer>,DefaultNodePath>(){
|
|
83 @Override
|
104
|
84 public DefaultNodePath f(List<Integer> path){
|
|
85 return new DefaultNodePath(path);
|
44
|
86 }
|
|
87 });
|
|
88 }
|
98
|
89
|
172
|
90 //PATHの一番後ろを取り除いたPATHを新しく作って返す
|
|
91 // EXAMPLE <0,0,3> → <0,0>
|
98
|
92 @Override
|
|
93 public NodePath tail() {
|
|
94 List<Integer> tail = path.reverse();
|
|
95 tail = tail.tail().reverse();
|
|
96 return new DefaultNodePath(tail);
|
|
97 }
|
138
|
98
|
43
|
99 }
|