annotate src/main/java/fj/data/TreeMap.java @ 4:19c719aba746 default tip

change getLoop return value
author tatsuki
date Mon, 20 Apr 2015 08:09:22 +0900
parents 68e5def4e745
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1 package fj.data;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
2
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
3 import fj.*;
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
4
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
5 import java.util.Iterator;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
6 import java.util.Map;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
7
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
8 import static fj.Function.compose;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
9 import static fj.Function.flip;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
10 import static fj.P.p;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
11 import static fj.data.IterableW.join;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
12 import static fj.data.List.iterableList;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
13
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
14 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
15 * An immutable, in-memory map, backed by a red-black tree.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
16 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
17 public final class TreeMap<K, V> implements Iterable<P2<K, V>> {
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
18 private final Set<P2<K, V>> tree;
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
19
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
20 private TreeMap(final Set<P2<K, V>> tree) {
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
21 this.tree = tree;
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
22 }
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
23
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
24 private static <K, V> Ord<P2<K, V>> ord(final Ord<K> keyOrd) {
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
25 return keyOrd.comap(P2.<K, V>__1());
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
26 }
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
27
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
28 /**
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
29 * Constructs an empty tree map.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
30 *
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
31 * @param keyOrd An order for the keys of the tree map.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
32 * @return an empty TreeMap with the given key order.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
33 */
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
34 public static <K, V> TreeMap<K, V> empty(final Ord<K> keyOrd) {
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
35 return new TreeMap<K, V>(Set.empty(TreeMap.<K, V>ord(keyOrd)));
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
36 }
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
37
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
38 /**
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
39 * Returns a potential value that the given key maps to.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
40 *
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
41 * @param k The key to look up in the tree map.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
42 * @return A potential value for the given key.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
43 */
2
d2b4440b2cc0 change getLoop
tatsuki
parents: 1
diff changeset
44 public Option<V> get(final K k) {
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
45 // Option<V> op = Option.<V> none();
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
46 // Option<P2<K, Option<V>>> attribute = tree.mapGet(P.p(k, op));
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
47 // return attribute.bind(P2.<K, Option<V>> __2());
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
48 // // P3<Set<P2<K, Option<V>>>, Option<P2<K, Option<V>>>, Set<P2<K,
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
49 // // Option<V>>>> splitTree = tree.split(P.p(k, op));
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
50 // // final Option<P2<K, Option<V>>> x = splitTree._2();
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
51 // //
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
52 // // System.out.println("aaaa");
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
53 // // return x.bind(P2.<K, Option<V>>__2());
4
19c719aba746 change getLoop return value
tatsuki
parents: 3
diff changeset
54 return Option.<V>some(getLoop(k));
2
d2b4440b2cc0 change getLoop
tatsuki
parents: 1
diff changeset
55 }
d2b4440b2cc0 change getLoop
tatsuki
parents: 1
diff changeset
56
4
19c719aba746 change getLoop return value
tatsuki
parents: 3
diff changeset
57 public V getLoop(final K k) {
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
58 Set<P2<K, V>> cur = tree;
2
d2b4440b2cc0 change getLoop
tatsuki
parents: 1
diff changeset
59 // Option<V> op = Option.<V>none();
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
60 while (!cur.isEmpty()) {
2
d2b4440b2cc0 change getLoop
tatsuki
parents: 1
diff changeset
61 // Ord<P2<K, V>> ttt = cur.ord();
d2b4440b2cc0 change getLoop
tatsuki
parents: 1
diff changeset
62
d2b4440b2cc0 change getLoop
tatsuki
parents: 1
diff changeset
63 P2<K, V> head = cur.head();
d2b4440b2cc0 change getLoop
tatsuki
parents: 1
diff changeset
64 K h = head._1();
d2b4440b2cc0 change getLoop
tatsuki
parents: 1
diff changeset
65 final int i = h.hashCode() - k.hashCode();
d2b4440b2cc0 change getLoop
tatsuki
parents: 1
diff changeset
66 // Ord<P2<K, V>> ord = cur.ord();
d2b4440b2cc0 change getLoop
tatsuki
parents: 1
diff changeset
67 // Ordering i = ord.compare(P.p(k,null), cur.head());
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
68 if (i > 0)
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
69 cur = cur.l();
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
70 else if (i < 0)
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
71 cur = cur.r();
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
72 else
4
19c719aba746 change getLoop return value
tatsuki
parents: 3
diff changeset
73 return head._2();
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
74
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
75
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
76 }
4
19c719aba746 change getLoop return value
tatsuki
parents: 3
diff changeset
77 return null;
2
d2b4440b2cc0 change getLoop
tatsuki
parents: 1
diff changeset
78 // return Option.<V>none();
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
79 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
80
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
81 /**
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
82 * Inserts the given key and value association into the tree map. If the given
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
83 * key is already mapped to a value, the old value is replaced with the given
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
84 * one.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
85 *
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
86 * @param k The key to insert.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
87 * @param v The value to insert.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
88 * @return A new tree map with the given value mapped to the given key.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
89 */
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
90 public TreeMap<K, V> set(final K k, final V v) {
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
91 return new TreeMap<K, V>(tree.insert(P.p(k, v)));
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
92 }
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
93
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
94 /**
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
95 * Deletes the entry in the tree map that corresponds to the given key.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
96 *
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
97 * @param k The key to delete from this tree map.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
98 * @return A new tree map with the entry corresponding to the given key
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
99 * removed.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
100 */
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
101 public TreeMap<K, V> delete(final K k) {
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
102 Option<V> op = Option.<V>none();
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
103 P2<K, V> p = P.p(k, null);
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
104 return new TreeMap<K, V>(tree.delete(p));
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
105 }
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
106
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
107 /**
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
108 * Returns the number of entries in this tree map.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
109 *
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
110 * @return The number of entries in this tree map.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
111 */
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
112 public int size() {
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
113 return tree.size();
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
114 }
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
115
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
116 /**
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
117 * Determines if this tree map has any entries.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
118 *
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
119 * @return <code>true</code> if this tree map has no entries,
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
120 * <code>false</code> otherwise.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
121 */
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
122 public boolean isEmpty() {
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
123 return tree.isEmpty();
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
124 }
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
125
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
126 /**
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
127 * Returns all values in this tree map.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
128 *
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
129 * @return All values in this tree map.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
130 */
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
131 // public List<V> values() {
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
132 // return iterableList(join(tree.toList().map(compose(IterableW.<V, Option<V>> wrap(), P2.<K, Option<V>> __2()))));
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
133 // }
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
134
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
135 /**
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
136 * Returns all keys in this tree map.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
137 *
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
138 * @return All keys in this tree map.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
139 */
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
140 public List<K> keys() {
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
141 return tree.toList().map(P2.<K, V>__1());
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
142 }
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
143
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
144 /**
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
145 * Determines if the given key value exists in this tree map.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
146 *
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
147 * @param k
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
148 * The key value to look for in this tree map.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
149 * @return <code>true</code> if this tree map contains the given key,
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
150 * <code>false</code> otherwise.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
151 */
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
152 // public boolean contains(final K k) {
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
153 // return tree.member(P.p(k, Option.<V> none()));
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
154 // }
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
155
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
156 /**
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
157 * Returns an iterator for this map's key-value pairs. This method exists to
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
158 * permit the use in a <code>for</code>-each loop.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
159 *
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
160 * @return A iterator for this map's key-value pairs.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
161 */
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
162 public Iterator<P2<K, V>> iterator() {
3
68e5def4e745 change iterator but not Parallels
tatsuki
parents: 2
diff changeset
163 return tree.iterator();
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
164 // join(
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
165 // tree.toStream().map(P2.<K, Option<V>, IterableW<V>> map2_(IterableW.<V, Option<V>> wrap()))
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
166 // .map(P2.tuple(compose(IterableW.<V, P2<K, V>> map(), P.<K, V> p2())))).iterator();
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
167 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
168
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
169 /**
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
170 * A mutable map projection of this tree map.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
171 *
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
172 * @return A new mutable map isomorphic to this tree map.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
173 */
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
174 public Map<K, V> toMutableMap() {
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
175 final Map<K, V> m = new java.util.TreeMap<K, V>();
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
176 for (final P2<K, V> e : this) {
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
177 m.put(e._1(), e._2());
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
178 }
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
179 return m;
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
180 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
181
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
182 /**
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
183 * An immutable projection of the given mutable map.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
184 *
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
185 * @param ord An order for the map's keys.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
186 * @param m A mutable map to project to an immutable one.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
187 * @return A new immutable tree map isomorphic to the given mutable map.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
188 */
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
189 public static <K, V> TreeMap<K, V> fromMutableMap(final Ord<K> ord, final Map<K, V> m) {
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
190 TreeMap<K, V> t = empty(ord);
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
191 for (final Map.Entry<K, V> e : m.entrySet()) {
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
192 t = t.set(e.getKey(), e.getValue());
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
193 }
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
194 return t;
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
195 }
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
196
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
197 /**
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
198 * Returns a first-class version of the get method for this TreeMap.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
199 *
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
200 * @return a functional representation of this TreeMap.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
201 */
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
202 public F<K, Option<V>> get() {
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
203 return new F<K, Option<V>>() {
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
204 public Option<V> f(final K k) {
4
19c719aba746 change getLoop return value
tatsuki
parents: 3
diff changeset
205 return get(k);
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
206 }
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
207 };
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
208 }
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
209
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
210 /**
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
211 * Modifies the value for the given key, if present, by applying the given
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
212 * function to it.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
213 *
2
d2b4440b2cc0 change getLoop
tatsuki
parents: 1
diff changeset
214 * @param k The key for the value to modify.
d2b4440b2cc0 change getLoop
tatsuki
parents: 1
diff changeset
215 * @param f A function with which to modify the value.
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
216 * @return A new tree map with the value for the given key transformed by the
2
d2b4440b2cc0 change getLoop
tatsuki
parents: 1
diff changeset
217 * given function, paired with True if the map was modified, otherwise
d2b4440b2cc0 change getLoop
tatsuki
parents: 1
diff changeset
218 * False.
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
219 */
2
d2b4440b2cc0 change getLoop
tatsuki
parents: 1
diff changeset
220 public P2<Boolean, TreeMap<K, V>> update(final K k, final F<V, V> f) {
d2b4440b2cc0 change getLoop
tatsuki
parents: 1
diff changeset
221 return null;
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
222 // final P2<Boolean, Set<P2<K, Option<V>>>> up = tree.update(p(k, Option.<V> none()),
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
223 // P2.<K, Option<V>, Option<V>> map2_(Option.<V, V> map().f(f)));
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
224 // return P.p(up._1(), new TreeMap<K, V>(up._2()));
2
d2b4440b2cc0 change getLoop
tatsuki
parents: 1
diff changeset
225 }
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
226
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
227 /**
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
228 * Modifies the value for the given key, if present, by applying the given
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
229 * function to it, or inserts the given value if the key is not present.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
230 *
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
231 * @param k
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
232 * The key for the value to modify.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
233 * @param f
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
234 * A function with which to modify the value.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
235 * @param v
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
236 * A value to associate with the given key if the key is not already
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
237 * present.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
238 * @return A new tree map with the value for the given key transformed by the
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
239 * given function.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
240 */
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
241 // public TreeMap<K, V> update(final K k, final F<V, V> f, final V v) {
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
242 // final P2<Boolean, TreeMap<K, V>> up = update(k, f);
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
243 // return up._1() ? up._2() : set(k, v);
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
244 // }
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
245
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
246 /**
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
247 * Splits this TreeMap at the given key. Returns a triple of:
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
248 * <ul>
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
249 * <li>A set containing all the values of this map associated with keys less
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
250 * than the given key.</li>
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
251 * <li>An option of a value mapped to the given key, if it exists in this map,
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
252 * otherwise None.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
253 * <li>A set containing all the values of this map associated with keys
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
254 * greater than the given key.</li>
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
255 * </ul>
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
256 *
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
257 * @param k
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
258 * A key at which to split this map.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
259 * @return Two sets and an optional value, where all elements in the first set
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
260 * are mapped to keys less than the given key in this map, all the
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
261 * elements in the second set are mapped to keys greater than the
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
262 * given key, and the optional value is the value associated with the
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
263 * given key if present, otherwise None.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
264 */
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
265 // public P3<Set<V>, Option<V>, Set<V>> split(final K k) {
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
266 // final F<Set<P2<K, Option<V>>>, Set<V>> getSome = F1Functions.mapSet(
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
267 // F1Functions.o(Option.<V> fromSome(), P2.<K, Option<V>> __2()),
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
268 // tree.ord().comap(F1Functions.o(P.<K, Option<V>> p2().f(k), Option.<V> some_())));
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
269 // return tree.split(p(k, Option.<V> none())).map1(getSome).map3(getSome)
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
270 // .map2(F1Functions.o(Option.<V> join(), F1Functions.mapOption(P2.<K, Option<V>> __2())));
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
271 // }
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
272
1
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
273 /**
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
274 * Maps the given function across the values of this TreeMap.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
275 *
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
276 * @param f
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
277 * A function to apply to the values of this TreeMap.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
278 * @return A new TreeMap with the values transformed by the given function.
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
279 */
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
280 // @SuppressWarnings({ "unchecked" })
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
281 // public <W> TreeMap<K, W> map(final F<V, W> f) {
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
282 // final F<P2<K, Option<V>>, P2<K, Option<W>>> g = P2.map2_(F1Functions.mapOption(f));
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
283 // final F<K, P2<K, Option<V>>> coord = flip(P.<K, Option<V>> p2()).f(Option.<V> none());
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
284 // final Ord<K> o = tree.ord().comap(coord);
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
285 // return new TreeMap<K, W>(tree.map(TreeMap.<K, Option<W>> ord(o), g));
8ed7d71e8617 minner change
tatsuki
parents: 0
diff changeset
286 // }
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
287
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
288 }