annotate src/main/java/fj/data/TreeMap.java @ 1:8ed7d71e8617

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