001 package fj.data.vector; 002 003 import fj.F2; 004 import fj.F3; 005 import fj.F4; 006 import fj.F5; 007 import fj.P; 008 import fj.P1; 009 import fj.P2; 010 011 /** 012 * Functions across vectors. 013 */ 014 public final class V { 015 016 private V() { 017 } 018 019 /** 020 * Puts elements in a vector-2. 021 * 022 * @param a1 An element to put in a vector. 023 * @param a2 An element to put in a vector. 024 * @return The vector-2. 025 */ 026 public static <A> V2<A> v(final A a1, final A a2) { 027 return V2.p(P.p(a1, a2)); 028 } 029 030 /** 031 * Puts elements in a vector-2. 032 * 033 * @param a1 An element to put in a vector. 034 * @param a2 An element to put in a vector. 035 * @return The vector-2. 036 */ 037 public static <A> V2<A> v(final P1<A> a1, final P1<A> a2) { 038 return V2.p(new P2<A, A>() { 039 public A _1() { 040 return a1._1(); 041 } 042 043 public A _2() { 044 return a2._1(); 045 } 046 }); 047 } 048 049 /** 050 * Returns a function that puts elements in a vector-2. 051 * 052 * @return A function that puts elements in a vector-2. 053 */ 054 public static <A> F2<A, A, V2<A>> v2() { 055 return new F2<A, A, V2<A>>() { 056 public V2<A> f(final A a, final A a1) { 057 return v(a, a1); 058 } 059 }; 060 } 061 062 /** 063 * Puts elements in a vector-3. 064 * 065 * @param a1 An element to put in a vector. 066 * @param a2 An element to put in a vector. 067 * @param a3 An element to put in a vector. 068 * @return The vector-3. 069 */ 070 public static <A> V3<A> v(final A a1, final A a2, final A a3) { 071 return V3.p(P.p(a1, a2, a3)); 072 } 073 074 /** 075 * Puts elements in a vector-3. 076 * 077 * @param a1 An element to put in a vector. 078 * @param a2 An element to put in a vector. 079 * @param a3 An element to put in a vector. 080 * @return The vector-3. 081 */ 082 public static <A> V3<A> v(final P1<A> a1, final P1<A> a2, final P1<A> a3) { 083 return V3.cons(a1, v(a2, a3)); 084 } 085 086 /** 087 * Returns a function that puts elements in a vector-3. 088 * 089 * @return A function that puts elements in a vector-3. 090 */ 091 public static <A> F3<A, A, A, V3<A>> v3() { 092 return new F3<A, A, A, V3<A>>() { 093 public V3<A> f(final A a, final A a1, final A a2) { 094 return v(a, a1, a2); 095 } 096 }; 097 } 098 099 /** 100 * Puts elements in a vector-4. 101 * 102 * @param a1 An element to put in a vector. 103 * @param a2 An element to put in a vector. 104 * @param a3 An element to put in a vector. 105 * @param a4 An element to put in a vector. 106 * @return The vector-4. 107 */ 108 public static <A> V4<A> v(final A a1, final A a2, final A a3, final A a4) { 109 return V4.p(P.p(a1, a2, a3, a4)); 110 } 111 112 /** 113 * Puts elements in a vector-4. 114 * 115 * @param a1 An element to put in a vector. 116 * @param a2 An element to put in a vector. 117 * @param a3 An element to put in a vector. 118 * @param a4 An element to put in a vector. 119 * @return The vector-4. 120 */ 121 public static <A> V4<A> v(final P1<A> a1, final P1<A> a2, final P1<A> a3, final P1<A> a4) { 122 return V4.cons(a1, v(a2, a3, a4)); 123 } 124 125 /** 126 * Returns a function that puts elements in a vector-4. 127 * 128 * @return A function that puts elements in a vector-4. 129 */ 130 public static <A> F4<A, A, A, A, V4<A>> v4() { 131 return new F4<A, A, A, A, V4<A>>() { 132 public V4<A> f(final A a, final A a1, final A a2, final A a3) { 133 return v(a, a1, a2, a3); 134 } 135 }; 136 } 137 138 139 /** 140 * Puts elements in a vector-5. 141 * 142 * @param a1 An element to put in a vector. 143 * @param a2 An element to put in a vector. 144 * @param a3 An element to put in a vector. 145 * @param a4 An element to put in a vector. 146 * @param a5 An element to put in a vector. 147 * @return The vector-5. 148 */ 149 public static <A> V5<A> v(final A a1, final A a2, final A a3, final A a4, final A a5) { 150 return V5.p(P.p(a1, a2, a3, a4, a5)); 151 } 152 153 /** 154 * Puts elements in a vector-5. 155 * 156 * @param a1 An element to put in a vector. 157 * @param a2 An element to put in a vector. 158 * @param a3 An element to put in a vector. 159 * @param a4 An element to put in a vector. 160 * @param a5 An element to put in a vector. 161 * @return The vector-5. 162 */ 163 public static <A> V5<A> v(final P1<A> a1, final P1<A> a2, final P1<A> a3, final P1<A> a4, final P1<A> a5) { 164 return V5.cons(a1, v(a2, a3, a4, a5)); 165 } 166 167 /** 168 * Returns a function that puts elements in a vector-5. 169 * 170 * @return A function that puts elements in a vector-5. 171 */ 172 public static <A> F5<A, A, A, A, A, V5<A>> v5() { 173 return new F5<A, A, A, A, A, V5<A>>() { 174 public V5<A> f(final A a, final A a1, final A a2, final A a3, final A a4) { 175 return v(a, a1, a2, a3, a4); 176 } 177 }; 178 } 179 180 }