// Path: src/main/java/ch/codebulb/lambdaomega/L.java
// public static <T> List<T> list(T... ts) {
//     return l(ts).l;
// }
// 
// Path: src/test/java/ch/codebulb/lambdaomega/TestUtil.java
// class TestUtil {
//     public static final List<Integer> EXPECTED_LIST = new ArrayList<>();
//     static {
//         EXPECTED_LIST.add(0);
//         EXPECTED_LIST.add(1);
//         EXPECTED_LIST.add(2);
//     }
//     
//     public static final List<List<Integer>> EXPECTED_NESTED_LIST = new ArrayList<>();
//     static {
//         EXPECTED_NESTED_LIST.add(EXPECTED_LIST);
//         EXPECTED_NESTED_LIST.add(EXPECTED_LIST);
//     }
//     
//     public static final Map<String, Integer> EXPECTED_MAP = new LinkedHashMap<>();
//     static {
//         EXPECTED_MAP.put("a", 0);
//         EXPECTED_MAP.put("b", 1);
//         EXPECTED_MAP.put("c", 2);
//     }
//     
//     public static final Map<String, Integer> EXPECTED_MAP_2_ELEMENTS = new LinkedHashMap<>();
//     static {
//         EXPECTED_MAP_2_ELEMENTS.put("a", 0);
//         EXPECTED_MAP_2_ELEMENTS.put("b", 1);
//     }
//     
//     public static final Set<Integer> EXPECTED_SET = new LinkedHashSet<>();
//     static {
//         EXPECTED_SET.add(0);
//         EXPECTED_SET.add(1);
//         EXPECTED_SET.add(2);
//     }
//     
//     public static final Set<Set<Integer>> EXPECTED_NESTED_SET = new LinkedHashSet<>();
//     static {
//         EXPECTED_NESTED_SET.add(EXPECTED_SET);
//         
//         Set<Integer> set2 = new LinkedHashSet<>();
//         set2.add(3);
//         set2.add(4);
//         set2.add(5);
//         EXPECTED_NESTED_SET.add(set2);
//     }
//     
//     public static <T> void assertEquals(T expected, T... actual) {
//         Arrays.stream(actual).forEach(it -> Assert.assertEquals(expected, it));
//     }
// }
// 
// Path: src/main/java/ch/codebulb/lambdaomega/V2.java
// public static <X, Y> V2<X, Y> v(X x, Y y) {
//     return new V2(x, y);
// }
// 
// Path: src/main/java/ch/codebulb/lambdaomega/abstractions/I.java
// public interface I<K, V> {
//     // We have to allow derived return values because we need that in V2
//     /**
//      * Invokes Map#get(Object) or invokes the function set by {@link #WithDefault(Function)} with the <code>key</code> provided,
//      * if it would return <code>null</code> or the key is invalid.
//      */
//     public <VN extends V> VN get(K key);
//     
//     /**
//      * @see #get(Object)
//      */
//     public default List<V> get(K... keys) {
//         return C.toStream(keys).map(it -> this.<V> get(it)).collect(Collectors.toList());
//     }
//     
//     /**
//      * @see #get(Object)
//      */
//     public default List<V> getAll(Collection<K>... keys) {
//         return C.toStream(keys).map(c -> C.toStream(c).map(it -> this.<V> get(it)).collect(Collectors.toList()))
//                 .flatMap(Collection::stream).collect(Collectors.toList());
//     }
//     
//     // We have to allow derived return values because we need that in V2
//     /**
//      * @see Map#getOrDefault(Object, Object)
//      */
//     public <VN extends V> VN getOrDefault(K key, VN defaultValue);
//     
//     /**
//      * Sets the function for creating a default value as an alternative to an otherwise unsuccessful {@link #get(Object)} invocation.
//      * 
//      * @param defaultValue the new default value
//      * @return <code>this (modified)</code>
//      */
//     public ReadonlyIndexedI<K, V> WithDefault(Function<K, V> defaultValue);
//     
//     /**
//      * @see #get(Object)
//      */
//     public default L<V> g(K... keys) {
//         return Get(keys);
//     }
//     
//     /**
//      * @see #get(Object)
//      */
//     public default V g(K key) {
//         return get(key);
//     }
//     
//     /**
//      * @see #get(Object)
//      */
//     public default L<V> Get(K... keys) {
//         return L(get(keys));
//     }
//     
//     /**
//      * @see #get(Object)
//      */
//     public default L<V> GetAll(Collection<K>... keys) {
//         return L(getAll(keys));
//     }
//     
//     /**
//      * @see #get(Object)
//      */
//     public default L<V> G(Collection<K>... keys) {
//         return L(getAll(keys));
//     }
// }


import static ch.codebulb.lambdaomega.L.list;
import static ch.codebulb.lambdaomega.TestUtil.*;
import static ch.codebulb.lambdaomega.V2.v;
import ch.codebulb.lambdaomega.abstractions.I;
import java.util.List;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.junit.Test;
package ch.codebulb.lambdaomega;


public class VTest {
    @Test
    public void testBasics() {
        assertTrue(v(0, "a").equals(v(0, "a")));
        assertFalse(v(1, "a").equals(v(0, "a")));
        assertFalse(v(0, "b").equals(v(0, "a")));
        
        assertEquals("(0, a)", v(0, "a").toString());
    }
    
    @Test
// Path: src/main/java/ch/codebulb/lambdaomega/L.java
// public static <T> List<T> list(T... ts) {
//     return l(ts).l;
// }
// 
// Path: src/test/java/ch/codebulb/lambdaomega/TestUtil.java
// class TestUtil {
//     public static final List<Integer> EXPECTED_LIST = new ArrayList<>();
//     static {
//         EXPECTED_LIST.add(0);
//         EXPECTED_LIST.add(1);
//         EXPECTED_LIST.add(2);
//     }
//     
//     public static final List<List<Integer>> EXPECTED_NESTED_LIST = new ArrayList<>();
//     static {
//         EXPECTED_NESTED_LIST.add(EXPECTED_LIST);
//         EXPECTED_NESTED_LIST.add(EXPECTED_LIST);
//     }
//     
//     public static final Map<String, Integer> EXPECTED_MAP = new LinkedHashMap<>();
//     static {
//         EXPECTED_MAP.put("a", 0);
//         EXPECTED_MAP.put("b", 1);
//         EXPECTED_MAP.put("c", 2);
//     }
//     
//     public static final Map<String, Integer> EXPECTED_MAP_2_ELEMENTS = new LinkedHashMap<>();
//     static {
//         EXPECTED_MAP_2_ELEMENTS.put("a", 0);
//         EXPECTED_MAP_2_ELEMENTS.put("b", 1);
//     }
//     
//     public static final Set<Integer> EXPECTED_SET = new LinkedHashSet<>();
//     static {
//         EXPECTED_SET.add(0);
//         EXPECTED_SET.add(1);
//         EXPECTED_SET.add(2);
//     }
//     
//     public static final Set<Set<Integer>> EXPECTED_NESTED_SET = new LinkedHashSet<>();
//     static {
//         EXPECTED_NESTED_SET.add(EXPECTED_SET);
//         
//         Set<Integer> set2 = new LinkedHashSet<>();
//         set2.add(3);
//         set2.add(4);
//         set2.add(5);
//         EXPECTED_NESTED_SET.add(set2);
//     }
//     
//     public static <T> void assertEquals(T expected, T... actual) {
//         Arrays.stream(actual).forEach(it -> Assert.assertEquals(expected, it));
//     }
// }
// 
// Path: src/main/java/ch/codebulb/lambdaomega/V2.java
// public static <X, Y> V2<X, Y> v(X x, Y y) {
//     return new V2(x, y);
// }
// 
// Path: src/main/java/ch/codebulb/lambdaomega/abstractions/I.java
// public interface I<K, V> {
//     // We have to allow derived return values because we need that in V2
//     /**
//      * Invokes Map#get(Object) or invokes the function set by {@link #WithDefault(Function)} with the <code>key</code> provided,
//      * if it would return <code>null</code> or the key is invalid.
//      */
//     public <VN extends V> VN get(K key);
//     
//     /**
//      * @see #get(Object)
//      */
//     public default List<V> get(K... keys) {
//         return C.toStream(keys).map(it -> this.<V> get(it)).collect(Collectors.toList());
//     }
//     
//     /**
//      * @see #get(Object)
//      */
//     public default List<V> getAll(Collection<K>... keys) {
//         return C.toStream(keys).map(c -> C.toStream(c).map(it -> this.<V> get(it)).collect(Collectors.toList()))
//                 .flatMap(Collection::stream).collect(Collectors.toList());
//     }
//     
//     // We have to allow derived return values because we need that in V2
//     /**
//      * @see Map#getOrDefault(Object, Object)
//      */
//     public <VN extends V> VN getOrDefault(K key, VN defaultValue);
//     
//     /**
//      * Sets the function for creating a default value as an alternative to an otherwise unsuccessful {@link #get(Object)} invocation.
//      * 
//      * @param defaultValue the new default value
//      * @return <code>this (modified)</code>
//      */
//     public ReadonlyIndexedI<K, V> WithDefault(Function<K, V> defaultValue);
//     
//     /**
//      * @see #get(Object)
//      */
//     public default L<V> g(K... keys) {
//         return Get(keys);
//     }
//     
//     /**
//      * @see #get(Object)
//      */
//     public default V g(K key) {
//         return get(key);
//     }
//     
//     /**
//      * @see #get(Object)
//      */
//     public default L<V> Get(K... keys) {
//         return L(get(keys));
//     }
//     
//     /**
//      * @see #get(Object)
//      */
//     public default L<V> GetAll(Collection<K>... keys) {
//         return L(getAll(keys));
//     }
//     
//     /**
//      * @see #get(Object)
//      */
//     public default L<V> G(Collection<K>... keys) {
//         return L(getAll(keys));
//     }
// }


// Path: src/test/java/ch/codebulb/lambdaomega/VTest.java
import static ch.codebulb.lambdaomega.L.list;
import static ch.codebulb.lambdaomega.TestUtil.*;
import static ch.codebulb.lambdaomega.V2.v;
import ch.codebulb.lambdaomega.abstractions.I;
import java.util.List;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.junit.Test;

package ch.codebulb.lambdaomega;


public class VTest {
    @Test
    public void testBasics() {
        assertTrue(v(0, "a").equals(v(0, "a")));
        assertFalse(v(1, "a").equals(v(0, "a")));
        assertFalse(v(0, "b").equals(v(0, "a")));
        
        assertEquals("(0, a)", v(0, "a").toString());
    }
    
    @Test
    public void testConvert() {