// Path: src/test/java/com/shapesecurity/functional/TestBase.java
// public abstract class TestBase {
//     private static final String BASE_PATH = System.getenv("CONFIG_DIR") == null ? "src/test/resources" : System.getenv(
//             "CONFIG_DIR");
// 
//     private static Random rand = new Random();
// 
//     protected static int rand(int low, int high) {
//         return rand.nextInt(Math.max(high - low, 1)) + low;
//     }
// 
//     protected static int rand() {
//         return rand(-100, 101);
//     }
// 
//     protected static Path getPath(String path) {
//         Path pathObj = Paths.get(BASE_PATH + '/' + path);
//         if (Files.exists(pathObj)) {
//             return pathObj;
//         } else {
//             try {
//                 return Paths.get(TestBase.class.getResource("/" + path).toURI());
//             } catch (URISyntaxException e) {
//                 throw new RuntimeException(e);
//             }
//         }
//     }
// 
//     @Nonnull
//     protected static String readFile(@Nonnull String path) throws IOException {
//         byte[] encoded = Files.readAllBytes(getPath(path));
//         return StandardCharsets.UTF_8.decode(ByteBuffer.wrap(encoded)).toString();
//     }
// 
//     // Tests
// 
//     // static
// 
//     static protected NonEmptyImmutableList<Integer> LONG_LIST = ImmutableList.of(rand());
//     static protected NonEmptyImmutableList<Integer> LONG_INT_LIST = ImmutableList.of(0);
//     static {
//         for (int i = 0; i < 1000; i++) {
//             LONG_LIST = LONG_LIST.cons(rand());
//         }
//         for (int i = 0; i < 1 << 14; i++) {
//             LONG_INT_LIST = LONG_INT_LIST.cons(i);
//         }
//     }
// 
//     @Before
//     public void setUp() {
//         rand = new Random(12345L);
//     }
// 
//     @Nonnull
//     public ImmutableList<Integer> range(final int upper) {
//         return range(0, upper);
//     }
// 
//     @Nonnull
//     public ImmutableList<Integer> range(final int lower, final int upper) {
//         return range(lower, upper, 1);
//     }
// 
//     @Nonnull
//     public ImmutableList<Integer> range(final int lower, final int upper, final int step) {
//         ImmutableList<Integer> result = ImmutableList.empty();
//         for (int i = upper - ((upper - lower + step - 1) % step + 1); i >= lower; i -= step) {
//             result = result.cons(i);
//         }
//         return result;
//     }
// }
// 
// Path: src/main/java/com/shapesecurity/functional/Thunk.java
// public final class Thunk<A> {
//     @Nonnull
//     private final Supplier<A> supplier;
//     // Exception on style: private nullable.
//     @Nullable
//     private volatile A value = null;
// 
//     private Thunk(@Nonnull Supplier<A> supplier) {
//         this.supplier = supplier;
//     }
// 
//     @Nonnull
//     public static <A> Thunk<A> constant(@Nonnull final A value) {
//         Thunk<A> t = new Thunk<>(() -> value);
//         t.value = value;
//         return t;
//     }
// 
//     @Nonnull
//     public static <A> Thunk<A> from(@Nonnull Supplier<A> supplier) {
//         return new Thunk<>(supplier);
//     }
// 
//     @Nonnull
//     public final A get() {
//         // Double locked.
//         A value = this.value;
//         if (value == null) {
//             synchronized (this) {
//                 value = this.value;
//                 if (value == null) {
//                     value = this.supplier.get();
//                     this.value = value;
//                 }
//             }
//         }
//         return value;
//     }
// }


import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import com.shapesecurity.functional.TestBase;
import com.shapesecurity.functional.Thunk;
import javax.annotation.Nullable;
import org.junit.Test;
        assertEquals(1, effect[0]);

        effect[0] = 0;
        Maybe.of(notNull).foreach(() -> {
            fail("Maybe.forEach(r, f) should not execute r on Just");
        }, x -> {
            effect[0] += 1;
        });
        assertEquals(1, effect[0]);
    }

    @Test
    public void testToList() {
        assertEquals(ImmutableList.<Integer>empty(), Maybe.<Integer>empty().toList());
        assertEquals(ImmutableList.of(notNull), Maybe.of(notNull).toList());
    }

    @Test
    public void testEq() {
        assertTrue(Maybe.fromNullable(notNull).eq(Maybe.of(notNull)));
        assertFalse(Maybe.fromNullable(notNull).eq(Maybe.of(notNull + 1)));
        assertFalse(Maybe.fromNullable(notNull).eq(Maybe.<Integer>empty()));
        assertTrue(Maybe.fromNullable(nulled).eq(Maybe.<Integer>empty()));
        assertFalse(Maybe.fromNullable(nulled).eq(Maybe.fromNullable(notNull)));
    }

    @Test
    public void testOrJusts() {
        assertEquals(notNull, Maybe.fromNullable(notNull).orJust(notNull));
        assertEquals(notNull, Maybe.fromNullable(nulled).orJust(notNull));
// Path: src/test/java/com/shapesecurity/functional/TestBase.java
// public abstract class TestBase {
//     private static final String BASE_PATH = System.getenv("CONFIG_DIR") == null ? "src/test/resources" : System.getenv(
//             "CONFIG_DIR");
// 
//     private static Random rand = new Random();
// 
//     protected static int rand(int low, int high) {
//         return rand.nextInt(Math.max(high - low, 1)) + low;
//     }
// 
//     protected static int rand() {
//         return rand(-100, 101);
//     }
// 
//     protected static Path getPath(String path) {
//         Path pathObj = Paths.get(BASE_PATH + '/' + path);
//         if (Files.exists(pathObj)) {
//             return pathObj;
//         } else {
//             try {
//                 return Paths.get(TestBase.class.getResource("/" + path).toURI());
//             } catch (URISyntaxException e) {
//                 throw new RuntimeException(e);
//             }
//         }
//     }
// 
//     @Nonnull
//     protected static String readFile(@Nonnull String path) throws IOException {
//         byte[] encoded = Files.readAllBytes(getPath(path));
//         return StandardCharsets.UTF_8.decode(ByteBuffer.wrap(encoded)).toString();
//     }
// 
//     // Tests
// 
//     // static
// 
//     static protected NonEmptyImmutableList<Integer> LONG_LIST = ImmutableList.of(rand());
//     static protected NonEmptyImmutableList<Integer> LONG_INT_LIST = ImmutableList.of(0);
//     static {
//         for (int i = 0; i < 1000; i++) {
//             LONG_LIST = LONG_LIST.cons(rand());
//         }
//         for (int i = 0; i < 1 << 14; i++) {
//             LONG_INT_LIST = LONG_INT_LIST.cons(i);
//         }
//     }
// 
//     @Before
//     public void setUp() {
//         rand = new Random(12345L);
//     }
// 
//     @Nonnull
//     public ImmutableList<Integer> range(final int upper) {
//         return range(0, upper);
//     }
// 
//     @Nonnull
//     public ImmutableList<Integer> range(final int lower, final int upper) {
//         return range(lower, upper, 1);
//     }
// 
//     @Nonnull
//     public ImmutableList<Integer> range(final int lower, final int upper, final int step) {
//         ImmutableList<Integer> result = ImmutableList.empty();
//         for (int i = upper - ((upper - lower + step - 1) % step + 1); i >= lower; i -= step) {
//             result = result.cons(i);
//         }
//         return result;
//     }
// }
// 
// Path: src/main/java/com/shapesecurity/functional/Thunk.java
// public final class Thunk<A> {
//     @Nonnull
//     private final Supplier<A> supplier;
//     // Exception on style: private nullable.
//     @Nullable
//     private volatile A value = null;
// 
//     private Thunk(@Nonnull Supplier<A> supplier) {
//         this.supplier = supplier;
//     }
// 
//     @Nonnull
//     public static <A> Thunk<A> constant(@Nonnull final A value) {
//         Thunk<A> t = new Thunk<>(() -> value);
//         t.value = value;
//         return t;
//     }
// 
//     @Nonnull
//     public static <A> Thunk<A> from(@Nonnull Supplier<A> supplier) {
//         return new Thunk<>(supplier);
//     }
// 
//     @Nonnull
//     public final A get() {
//         // Double locked.
//         A value = this.value;
//         if (value == null) {
//             synchronized (this) {
//                 value = this.value;
//                 if (value == null) {
//                     value = this.supplier.get();
//                     this.value = value;
//                 }
//             }
//         }
//         return value;
//     }
// }


// Path: src/test/java/com/shapesecurity/functional/data/MaybeTest.java
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import com.shapesecurity.functional.TestBase;
import com.shapesecurity.functional.Thunk;
import javax.annotation.Nullable;
import org.junit.Test;

        assertEquals(1, effect[0]);

        effect[0] = 0;
        Maybe.of(notNull).foreach(() -> {
            fail("Maybe.forEach(r, f) should not execute r on Just");
        }, x -> {
            effect[0] += 1;
        });
        assertEquals(1, effect[0]);
    }

    @Test
    public void testToList() {
        assertEquals(ImmutableList.<Integer>empty(), Maybe.<Integer>empty().toList());
        assertEquals(ImmutableList.of(notNull), Maybe.of(notNull).toList());
    }

    @Test
    public void testEq() {
        assertTrue(Maybe.fromNullable(notNull).eq(Maybe.of(notNull)));
        assertFalse(Maybe.fromNullable(notNull).eq(Maybe.of(notNull + 1)));
        assertFalse(Maybe.fromNullable(notNull).eq(Maybe.<Integer>empty()));
        assertTrue(Maybe.fromNullable(nulled).eq(Maybe.<Integer>empty()));
        assertFalse(Maybe.fromNullable(nulled).eq(Maybe.fromNullable(notNull)));
    }

    @Test
    public void testOrJusts() {
        assertEquals(notNull, Maybe.fromNullable(notNull).orJust(notNull));
        assertEquals(notNull, Maybe.fromNullable(nulled).orJust(notNull));
        assertEquals(notNull, Maybe.fromNullable(notNull).orJustLazy(Thunk.from(() -> notNull)));