Return-Path: X-Original-To: apmail-flink-commits-archive@minotaur.apache.org Delivered-To: apmail-flink-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 16D3E18A6C for ; Tue, 2 Feb 2016 17:23:11 +0000 (UTC) Received: (qmail 96138 invoked by uid 500); 2 Feb 2016 17:23:04 -0000 Delivered-To: apmail-flink-commits-archive@flink.apache.org Received: (qmail 96071 invoked by uid 500); 2 Feb 2016 17:23:04 -0000 Mailing-List: contact commits-help@flink.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@flink.apache.org Delivered-To: mailing list commits@flink.apache.org Received: (qmail 94402 invoked by uid 99); 2 Feb 2016 17:23:02 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 02 Feb 2016 17:23:02 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 61E23E0C09; Tue, 2 Feb 2016 17:23:02 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: sewen@apache.org To: commits@flink.apache.org Date: Tue, 02 Feb 2016 17:23:33 -0000 Message-Id: <817c3759e38d442d8e21c3abf6402cfc@git.apache.org> In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [33/38] flink git commit: [FLINK-3049] [api breaking] Move 'Either' type to 'flink-core / org.apache.flink.types' [FLINK-3049] [api breaking] Move 'Either' type to 'flink-core / org.apache.flink.types' Project: http://git-wip-us.apache.org/repos/asf/flink/repo Commit: http://git-wip-us.apache.org/repos/asf/flink/commit/54743866 Tree: http://git-wip-us.apache.org/repos/asf/flink/tree/54743866 Diff: http://git-wip-us.apache.org/repos/asf/flink/diff/54743866 Branch: refs/heads/master Commit: 54743866e86cbe7689ae1dcf001deb559629747b Parents: 360f02b Author: Stephan Ewen Authored: Sun Jan 31 23:27:36 2016 +0100 Committer: Stephan Ewen Committed: Tue Feb 2 16:55:44 2016 +0100 ---------------------------------------------------------------------- .../java/org/apache/flink/types/Either.java | 185 +++++++++++++++++++ 1 file changed, 185 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flink/blob/54743866/flink-core/src/main/java/org/apache/flink/types/Either.java ---------------------------------------------------------------------- diff --git a/flink-core/src/main/java/org/apache/flink/types/Either.java b/flink-core/src/main/java/org/apache/flink/types/Either.java new file mode 100644 index 0000000..361802b --- /dev/null +++ b/flink-core/src/main/java/org/apache/flink/types/Either.java @@ -0,0 +1,185 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.flink.types; + +/** + * This type represents a value of one two possible types, Left or Right (a + * disjoint union), inspired by Scala's Either type. + * + * @param + * the type of Left + * @param + * the type of Right + */ +public abstract class Either { + + /** + * Create a Left value of Either + */ + public static Either Left(L value) { + return new Left(value); + } + + /** + * Create a Right value of Either + */ + public static Either Right(R value) { + return new Right(value); + } + + /** + * Retrieve the Left value of Either. + * + * @return the Left value + * @throws IllegalStateException + * if called on a Right + */ + public abstract L left() throws IllegalStateException; + + /** + * Retrieve the Right value of Either. + * + * @return the Right value + * @throws IllegalStateException + * if called on a Left + */ + public abstract R right() throws IllegalStateException; + + /** + * + * @return true if this is a Left value, false if this is a Right value + */ + public final boolean isLeft() { + return getClass() == Left.class; + } + + /** + * + * @return true if this is a Right value, false if this is a Left value + */ + public final boolean isRight() { + return getClass() == Right.class; + } + + /** + * A left value of {@link Either} + * + * @param + * the type of Left + * @param + * the type of Right + */ + public static class Left extends Either { + private final L value; + + public Left(L value) { + this.value = java.util.Objects.requireNonNull(value); + } + + @Override + public L left() { + return value; + } + + @Override + public R right() { + throw new IllegalStateException("Cannot retrieve Right value on a Left"); + } + + @Override + public boolean equals(Object object) { + if (object instanceof Left) { + final Left other = (Left) object; + return value.equals(other.value); + } + return false; + } + + @Override + public int hashCode() { + return value.hashCode(); + } + + @Override + public String toString() { + return "Left(" + value.toString() + ")"; + } + + /** + * Creates a left value of {@link Either} + * + */ + public static Left of(L left) { + return new Left(left); + } + } + + /** + * A right value of {@link Either} + * + * @param + * the type of Left + * @param + * the type of Right + */ + public static class Right extends Either { + private final R value; + + public Right(R value) { + this.value = java.util.Objects.requireNonNull(value); + } + + @Override + public L left() { + throw new IllegalStateException("Cannot retrieve Left value on a Right"); + } + + @Override + public R right() { + return value; + } + + @Override + public boolean equals(Object object) { + if (object instanceof Right) { + final Right other = (Right) object; + return value.equals(other.value); + } + return false; + } + + @Override + public int hashCode() { + return value.hashCode(); + } + + @Override + public String toString() { + return "Right(" + value.toString() + ")"; + } + + /** + * Creates a right value of {@link Either} + * + */ + public static Right of(R right) { + return new Right(right); + } + } +}