// Path: src/main/java/com/shapesecurity/functional/F.java
// @CheckReturnValue
// @FunctionalInterface
// public interface F<A, R> {
//     @Nonnull
//     static <A extends B, B> F<A, B> id() {
//         return o -> o;
//     }
// 
//     @Nonnull
//     static <A, B> F<A, B> constant(@Nonnull final B b) {
//         return a -> b;
//     }
// 
//     @Nonnull
//     static <A, B, C> F2<A, B, C> uncurry(@Nonnull final F<A, F<B, C>> f) {
//         return (a, b) -> f.apply(a).apply(b);
//     }
// 
//     @Nonnull
//     static <A, B, C> F<B, F<A, C>> flip(@Nonnull final F<A, F<B, C>> f) {
//         return b -> a -> f.apply(a).apply(b);
//     }
// 
//     @Nonnull
//     R apply(@Nonnull A a);
// 
//     @Nonnull
//     default <C> F<C, R> compose(@Nonnull final F<C, A> f) {
//         return c -> this.apply(f.apply(c));
//     }
// 
// 
//     @Nonnull
//     default <B> F<A, B> then(@Nonnull final F<R, B> f) {
//         return c -> f.apply(this.apply(c));
//     }
// }


import java.util.function.IntFunction;
import com.shapesecurity.functional.F;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
        return acc;
    }

    private static ConcatList<Integer> genRL(int size) {
        ConcatList<Integer> acc = ConcatList.empty();
        for (int i = 0; i < size; i++) {
            acc = acc.append1(i);
        }
        return acc;
    }

    @Parameterized.Parameter
    public IntFunction<ConcatList<Integer>> generator;

    @Test
    public void simpleTest() {
        assertTrue(ConcatList.empty().isEmpty());
        assertFalse(ConcatList.single(0).isEmpty());
        ConcatList<Integer> bt = ConcatList.single(0);
        for (int i = 0; i < 10; i++) {
            bt = bt.append(bt);
        }
        assertEquals(1024, bt.length);
        assertFalse(bt.isEmpty());
        assertFalse(ConcatList.empty().append(ConcatList.single(0)).isEmpty());
        assertFalse(ConcatList.single(0).append(ConcatList.single(0)).isEmpty());
    }

    @Test
    public void findTest() {
// Path: src/main/java/com/shapesecurity/functional/F.java
// @CheckReturnValue
// @FunctionalInterface
// public interface F<A, R> {
//     @Nonnull
//     static <A extends B, B> F<A, B> id() {
//         return o -> o;
//     }
// 
//     @Nonnull
//     static <A, B> F<A, B> constant(@Nonnull final B b) {
//         return a -> b;
//     }
// 
//     @Nonnull
//     static <A, B, C> F2<A, B, C> uncurry(@Nonnull final F<A, F<B, C>> f) {
//         return (a, b) -> f.apply(a).apply(b);
//     }
// 
//     @Nonnull
//     static <A, B, C> F<B, F<A, C>> flip(@Nonnull final F<A, F<B, C>> f) {
//         return b -> a -> f.apply(a).apply(b);
//     }
// 
//     @Nonnull
//     R apply(@Nonnull A a);
// 
//     @Nonnull
//     default <C> F<C, R> compose(@Nonnull final F<C, A> f) {
//         return c -> this.apply(f.apply(c));
//     }
// 
// 
//     @Nonnull
//     default <B> F<A, B> then(@Nonnull final F<R, B> f) {
//         return c -> f.apply(this.apply(c));
//     }
// }


// Path: src/test/java/com/shapesecurity/functional/data/ConcatListTest.java
import java.util.function.IntFunction;
import com.shapesecurity.functional.F;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

        return acc;
    }

    private static ConcatList<Integer> genRL(int size) {
        ConcatList<Integer> acc = ConcatList.empty();
        for (int i = 0; i < size; i++) {
            acc = acc.append1(i);
        }
        return acc;
    }

    @Parameterized.Parameter
    public IntFunction<ConcatList<Integer>> generator;

    @Test
    public void simpleTest() {
        assertTrue(ConcatList.empty().isEmpty());
        assertFalse(ConcatList.single(0).isEmpty());
        ConcatList<Integer> bt = ConcatList.single(0);
        for (int i = 0; i < 10; i++) {
            bt = bt.append(bt);
        }
        assertEquals(1024, bt.length);
        assertFalse(bt.isEmpty());
        assertFalse(ConcatList.empty().append(ConcatList.single(0)).isEmpty());
        assertFalse(ConcatList.single(0).append(ConcatList.single(0)).isEmpty());
    }

    @Test
    public void findTest() {
        assertEquals(Maybe.<Integer>empty(), ConcatList.<Integer>empty().find(F.constant(true)));