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    }