All Downloads are FREE. Search and download functionalities are using the official Maven repository.

javascalautils.Projection Maven / Gradle / Ivy

There is a newer version: 1.11.2
Show newest version
/**
 *  Copyright 2015 Peter Nerg
 *
 *  Licensed 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 javascalautils;

import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.function.Supplier;
import java.util.stream.Stream;

/**
 * Abstract base class for the projections used by {@link Either}.
 * 
 * @author Peter Nerg
 * @since 1.1
 */
abstract class Projection implements Iterable {

    /**
     * Returns the value of the Right/Left in {@link Some} side in case the projection matches the side, else {@link None}. 
* That is:
* If this is a {@link RightProjection} with a {@link Right}
* or
* If this is a {@link LeftProjection} with a {@link Left}.
* Then then return {@link Some} containing the value of the {@link Left}/{@link Right}.
* Any other case, return {@link None}. * * @return The Option */ public Option asOption() { return Option.apply(orNull()); } /** * Returns the value of the Right/Left side in case the projection matches the side, else throw {@link NoSuchElementException}.
* That is:
* If this is a {@link RightProjection} with a {@link Right}
* or
* If this is a {@link LeftProjection} with a {@link Left}.
* Then return the value of the {@link Left}/{@link Right}.
* Any other case, throw {@link NoSuchElementException}. * * @return The value */ public T get() { return asOption().get(); } /** * Returns the iterator of the Right/Left side in case the projection matches the side.
* That is:
* If this is a {@link RightProjection} with a {@link Right}
* or
* If this is a {@link LeftProjection} with a {@link Left}.
* Then return an iterator with the value for the {@link Left}/{@link Right}.
* Else return an empty iterator * * @return The iterator */ @Override public Iterator iterator() { return stream().iterator(); } /** * Returns the stream of the Right/Left side in case the projection matches the side.
* That is:
* If this is a {@link RightProjection} with a {@link Right}
* or
* If this is a {@link LeftProjection} with a {@link Left}.
* Then return a stream with the value for the {@link Left}/{@link Right}.
* Else return an empty stream * * @return The stream */ public Stream stream() { return asOption().stream(); } /** * Returns the value of this projection if it is of the correct type else null.
* That is:
* If this is a {@link RightProjection} with a {@link Right}
* or
* If this is a {@link LeftProjection} with a {@link Left}.
* Then return the value of the {@link Left}/{@link Right}.
* Any other case, return null.
* In an essence this is a specialized version of {@link #getOrElse(Supplier)} where the supplier returns null.
*
getOrElse(() -> null)
* * @return The value or null */ public T orNull() { return getOrElse(() -> null); } /** * Returns the value of this projection if it is of the correct type else else the value provided by the supplier.
* That is:
* If this is a {@link RightProjection} with a {@link Right}
* or
* If this is a {@link LeftProjection} with a {@link Left}.
* Then return the value of the {@link Left}/{@link Right}.
* Any other case, return the value provided by the supplier. * * @param supplier * The supplier to use if else becomes used * @return The value or null */ public abstract T getOrElse(Supplier supplier); }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy