annotate src/main/java/fj/data/vector/V3.java @ 0:fe80c1edf1be

add getLoop
author tatsuki
date Fri, 20 Mar 2015 21:04:03 +0900
parents
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.vector;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
2
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
3 import fj.F;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
4 import fj.F2;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
5 import fj.P1;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
6 import fj.P2;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
7 import fj.P3;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
8 import static fj.Function.curry;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
9 import static fj.P.p2;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
10 import fj.data.Array;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
11 import fj.data.NonEmptyList;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
12 import fj.data.Stream;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
13
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
14 import java.util.Iterator;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
15
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
16 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
17 * A vector-3.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
18 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
19 public final class V3<A> implements Iterable<A> {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
20
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
21 private final V2<A> tail;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
22 private final P1<A> head;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
23
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
24 private V3(final P1<A> head, final V2<A> tail) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
25 this.head = head;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
26 this.tail = tail;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
27 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
28
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
29 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
30 * Creates a vector-3 from a homogeneous product-3.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
31 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
32 * @param p The product-3 from which to create a vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
33 * @return A new vector-3.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
34 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
35 public static <A> V3<A> p(final P3<A, A, A> p) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
36 return new V3<A>(new P1<A>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
37 public A _1() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
38 return p._1();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
39 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
40 }, V2.p(new P2<A, A>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
41 public A _1() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
42 return p._2();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
43 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
44
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
45 public A _2() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
46 return p._3();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
47 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
48 }));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
49 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
50
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
51 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
52 * Creates a vector-3 from a head and a tail.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
53 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
54 * @param head The value to put as the first element of the vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
55 * @param tail The vector representing all but the first element of the new vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
56 * @return The new vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
57 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
58 public static <A> V3<A> cons(final P1<A> head, final V2<A> tail) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
59 return new V3<A>(head, tail);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
60 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
61
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
62 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
63 * Returns the first element of this vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
64 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
65 * @return the first element of this vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
66 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
67 public A _1() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
68 return head._1();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
69 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
70
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
71 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
72 * Returns the second element of this vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
73 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
74 * @return the second element of this vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
75 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
76 public A _2() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
77 return tail._1();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
78 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
79
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
80 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
81 * Returns the third element of this vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
82 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
83 * @return the third element of this vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
84 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
85 public A _3() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
86 return tail._2();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
87 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
88
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
89 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
90 * Returns all but the first element of this vector, as a vector-2.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
91 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
92 * @return all but the first element of this vector, as a vector-2.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
93 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
94 public V2<A> tail() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
95 return tail;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
96 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
97
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
98 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
99 * Returns the first element of this vector, as a product-1.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
100 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
101 * @return the first element of this vector, as a product-1.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
102 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
103 public P1<A> head() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
104 return head;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
105 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
106
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
107 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
108 * Returns a homogeneous product-3 equivalent to this vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
109 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
110 * @return a homogeneous product-3 equivalent to this vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
111 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
112 public P3<A, A, A> p() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
113 return new P3<A, A, A>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
114 public A _1() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
115 return V3.this._1();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
116 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
117
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
118 public A _2() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
119 return V3.this._2();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
120 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
121
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
122 public A _3() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
123 return V3.this._3();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
124 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
125 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
126 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
127
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
128 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
129 * Returns an array with the elements of this vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
130 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
131 * @return an array with the elements of this vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
132 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
133 @SuppressWarnings("unchecked")
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
134 public Array<A> toArray() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
135 return Array.array(_1(), _2(), _3());
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
136 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
137
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
138
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
139 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
140 * Performs function application within a vector (applicative functor pattern).
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
141 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
142 * @param vf The vector of functions to apply.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
143 * @return A new vector after zipping the given vector of functions over this vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
144 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
145 public <B> V3<B> apply(final V3<F<A, B>> vf) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
146 return new V3<B>(head.<B>apply(vf.head()), tail.apply(vf.tail()));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
147 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
148
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
149 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
150 * Zips this vector with the given vector using the given function to produce a new vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
151 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
152 * @param bs The vector to zip this vector with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
153 * @param f The function to zip this vector and the given vector with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
154 * @return A new vector with the results of the function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
155 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
156 public <B, C> V3<C> zipWith(final F<A, F<B, C>> f, final V3<B> bs) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
157 return bs.apply(map(f));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
158 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
159
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
160 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
161 * Zips this vector with the given vector to produce a vector of pairs.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
162 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
163 * @param bs The vector to zip this vector with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
164 * @return A new vector with a length the same as the shortest of this vector and the given
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
165 * vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
166 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
167 public <B> V3<P2<A, B>> zip(final V3<B> bs) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
168 final F<A, F<B, P2<A, B>>> __2 = p2();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
169 return zipWith(__2, bs);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
170 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
171
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
172 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
173 * Zips this vector with the given vector to produce a vector of vectors.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
174 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
175 * @param bs The vector to zip this vector with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
176 * @return A new vector of vectors.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
177 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
178 public V3<V2<A>> vzip(final V3<A> bs) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
179 final F2<A, A, V2<A>> __2 = V.v2();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
180 return zipWith(curry(__2), bs);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
181 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
182
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
183 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
184 * Returns an iterator for the elements of this vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
185 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
186 * @return an iterator for the elements of this vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
187 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
188 public Iterator<A> iterator() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
189 return toStream().iterator();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
190 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
191
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
192 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
193 * Returns a nonempty list with the elements of this vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
194 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
195 * @return a nonempty list with the elements of this vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
196 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
197 public NonEmptyList<A> toNonEmptyList() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
198 return NonEmptyList.nel(head()._1(), tail().toNonEmptyList().toList());
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
199 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
200
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
201 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
202 * Returns a stream of the elements of this vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
203 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
204 * @return a stream of the elements of this vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
205 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
206 public Stream<A> toStream() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
207 return Stream.cons(head()._1(), new P1<Stream<A>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
208 public Stream<A> _1() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
209 return tail().toStream();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
210 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
211 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
212 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
213
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
214 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
215 * Maps the given function across this vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
216 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
217 * @param f The function to map across this vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
218 * @return A new vector after the given function has been applied to each element.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
219 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
220 public <B> V3<B> map(final F<A, B> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
221 return new V3<B>(head().map(f), tail().map(f));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
222 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
223
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
224 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
225 * Returns a function that transforms a vector-3 to a stream of its elements.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
226 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
227 * @return a function that transforms a vector-3 to a stream of its elements.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
228 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
229 public static <A> F<V3<A>, Stream<A>> toStream_() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
230 return new F<V3<A>, Stream<A>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
231 public Stream<A> f(final V3<A> v) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
232 return v.toStream();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
233 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
234 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
235 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
236
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
237 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
238 * Returns a function that transforms a vector-3 to the equivalent product-3.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
239 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
240 * @return a function that transforms a vector-3 to the equivalent product-3.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
241 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
242 public static <A> F<V3<A>, P3<A, A, A>> p_() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
243 return new F<V3<A>, P3<A, A, A>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
244 public P3<A, A, A> f(final V3<A> v) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
245 return v.p();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
246 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
247 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
248 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
249
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
250 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
251 * A first-class function to get the first element of a vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
252 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
253 * @return a function that gets the first element of a given vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
254 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
255 public static <A> F<V3<A>, A> __1() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
256 return new F<V3<A>, A>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
257 public A f(final V3<A> v) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
258 return v._1();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
259 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
260 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
261 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
262
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
263 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
264 * A first-class function to get the second element of a vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
265 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
266 * @return a function that gets the second element of a given vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
267 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
268 public static <A> F<V3<A>, A> __2() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
269 return new F<V3<A>, A>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
270 public A f(final V3<A> v) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
271 return v._2();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
272 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
273 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
274 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
275
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
276 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
277 * A first-class function to get the third element of a vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
278 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
279 * @return a function that gets the third element of a given vector.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
280 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
281 public static <A> F<V3<A>, A> __3() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
282 return new F<V3<A>, A>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
283 public A f(final V3<A> v) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
284 return v._3();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
285 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
286 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
287 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
288
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
289 }