// Path: src/main/java/com/shapesecurity/functional/Effect.java
// @FunctionalInterface
// public interface Effect<A> extends F<A, Unit> {
//     void e(@Nonnull A a);
// 
//     @Nonnull
//     default Unit apply(@Nonnull A a) {
//         this.e(a);
//         return Unit.unit;
//     }
// }
// 
// 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/main/java/com/shapesecurity/functional/ThrowingSupplier.java
// @FunctionalInterface
// public interface ThrowingSupplier<A> {
//     A get() throws Exception;
// }
// 
// 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 com.shapesecurity.functional.Effect;
import com.shapesecurity.functional.F;
import com.shapesecurity.functional.ThrowingSupplier;
import com.shapesecurity.functional.Thunk;
import javax.annotation.CheckReturnValue;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Iterator;
import java.util.Objects;
import java.util.function.Predicate;
import java.util.function.Supplier;
        if (this.value == null) {
            r.run();
        } else {
            f.apply(this.value);
        }
    }

    public boolean isJust() {
        return this.value != null;
    }

    public final boolean isNothing() {
        return !this.isJust();
    }

    @Nonnull
    public ImmutableList<A> toList() {
        return this.value == null ? ImmutableList.empty() : ImmutableList.from(this.value);
    }

    @Nonnull
    public A orJust(@Nonnull A a) {
        return this.value == null ? a : this.value;
    }

    /**
     * @deprecated Use {@link #orJustLazy(Supplier)} instead.
     */
    @Nonnull
    @Deprecated
// Path: src/main/java/com/shapesecurity/functional/Effect.java
// @FunctionalInterface
// public interface Effect<A> extends F<A, Unit> {
//     void e(@Nonnull A a);
// 
//     @Nonnull
//     default Unit apply(@Nonnull A a) {
//         this.e(a);
//         return Unit.unit;
//     }
// }
// 
// 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/main/java/com/shapesecurity/functional/ThrowingSupplier.java
// @FunctionalInterface
// public interface ThrowingSupplier<A> {
//     A get() throws Exception;
// }
// 
// 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/main/java/com/shapesecurity/functional/data/Maybe.java
import com.shapesecurity.functional.Effect;
import com.shapesecurity.functional.F;
import com.shapesecurity.functional.ThrowingSupplier;
import com.shapesecurity.functional.Thunk;
import javax.annotation.CheckReturnValue;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Iterator;
import java.util.Objects;
import java.util.function.Predicate;
import java.util.function.Supplier;

        if (this.value == null) {
            r.run();
        } else {
            f.apply(this.value);
        }
    }

    public boolean isJust() {
        return this.value != null;
    }

    public final boolean isNothing() {
        return !this.isJust();
    }

    @Nonnull
    public ImmutableList<A> toList() {
        return this.value == null ? ImmutableList.empty() : ImmutableList.from(this.value);
    }

    @Nonnull
    public A orJust(@Nonnull A a) {
        return this.value == null ? a : this.value;
    }

    /**
     * @deprecated Use {@link #orJustLazy(Supplier)} instead.
     */
    @Nonnull
    @Deprecated
    public A orJustLazy(@Nonnull Thunk<A> a) {