// 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;
// }


import com.shapesecurity.functional.Effect;
import com.shapesecurity.functional.F;
import com.shapesecurity.functional.ThrowingSupplier;
import javax.annotation.CheckReturnValue;
import javax.annotation.Nonnull;
        }
    }

    public final boolean isLeft() {
        return this.tag == Tag.LEFT;
    }

    public final boolean isRight() {
        return this.tag == Tag.RIGHT;
    }

    @SuppressWarnings("unchecked")
    public <X> X either(F<A, X> f1, F<B, X> f2) {
        if (this.tag == Tag.LEFT) {
            return f1.apply((A) this.data);
        } else {
            return f2.apply((B) this.data);
        }
    }

    @SuppressWarnings("unchecked")
    public void foreach(@Nonnull Effect<A> f1, @Nonnull Effect<B> f2) {
        if (this.tag == Tag.LEFT) {
            f1.apply((A) this.data);
        } else {
            f2.apply((B) this.data);
        }
    }

    @Nonnull
// 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/data/Either.java
import com.shapesecurity.functional.Effect;
import com.shapesecurity.functional.F;
import com.shapesecurity.functional.ThrowingSupplier;
import javax.annotation.CheckReturnValue;
import javax.annotation.Nonnull;

        }
    }

    public final boolean isLeft() {
        return this.tag == Tag.LEFT;
    }

    public final boolean isRight() {
        return this.tag == Tag.RIGHT;
    }

    @SuppressWarnings("unchecked")
    public <X> X either(F<A, X> f1, F<B, X> f2) {
        if (this.tag == Tag.LEFT) {
            return f1.apply((A) this.data);
        } else {
            return f2.apply((B) this.data);
        }
    }

    @SuppressWarnings("unchecked")
    public void foreach(@Nonnull Effect<A> f1, @Nonnull Effect<B> f2) {
        if (this.tag == Tag.LEFT) {
            f1.apply((A) this.data);
        } else {
            f2.apply((B) this.data);
        }
    }

    @Nonnull
    public <X, Y> Either<X, Y> map(F<A, X> f1, F<B, Y> f2) {