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

    @Nonnull
    public static <A, B> Either<A, B> right(@Nonnull B b) {
        return new Either<>(b, Tag.RIGHT);
    }

    @Nonnull
    public static <A, B extends A, C extends A> A extract(Either<B, C> e) {
        return e.either(x -> x, x -> x);
    }

    @Nonnull
    public static <A> Either<Exception, A> _try(@Nonnull ThrowingSupplier<A> s) {
        try {
            return Either.right(s.get());
        } catch (Exception e) {
            return Either.left(e);
        }
    }

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

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

    @SuppressWarnings("unchecked")
// 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;

    }

    @Nonnull
    public static <A, B> Either<A, B> right(@Nonnull B b) {
        return new Either<>(b, Tag.RIGHT);
    }

    @Nonnull
    public static <A, B extends A, C extends A> A extract(Either<B, C> e) {
        return e.either(x -> x, x -> x);
    }

    @Nonnull
    public static <A> Either<Exception, A> _try(@Nonnull ThrowingSupplier<A> s) {
        try {
            return Either.right(s.get());
        } catch (Exception e) {
            return Either.left(e);
        }
    }

    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) {