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

org.jhotdraw8.icollection.facade.ReadOnlySequencedSetFacade Maven / Gradle / Ivy

The newest version!
/*
 * @(#)ReadOnlySequencedSetFacade.java
 * Copyright © 2023 The authors and contributors of JHotDraw. MIT License.
 */
package org.jhotdraw8.icollection.facade;

import org.jhotdraw8.icollection.readonly.ReadOnlySequencedSet;

import java.util.Iterator;
import java.util.SequencedSet;
import java.util.Spliterator;
import java.util.function.IntSupplier;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * Provides a {@link ReadOnlySequencedSet} facade to a set of {@code SequencedSet} functions.
 *
 * @param  the element type
 * @author Werner Randelshofer
 */
public class ReadOnlySequencedSetFacade extends ReadOnlySetFacade
        implements ReadOnlySequencedSet {

    final Supplier getFirstFunction;
    final Supplier getLastFunction;
    final Supplier> reverseIteratorFunction;

    public ReadOnlySequencedSetFacade(ReadOnlySequencedSet backingSet) {
        this(backingSet::iterator, () -> backingSet.readOnlyReversed().iterator(), backingSet::size,
                backingSet::contains, backingSet::getFirst, backingSet::getLast, Spliterator.SIZED | Spliterator.DISTINCT);
    }

    public ReadOnlySequencedSetFacade(SequencedSet backingSet) {
        this(backingSet::iterator, () -> backingSet.reversed().iterator(), backingSet::size,
                backingSet::contains, backingSet::getFirst, backingSet::getLast, Spliterator.SIZED | Spliterator.DISTINCT);
    }

    public ReadOnlySequencedSetFacade(Supplier> iteratorFunction,
                                      Supplier> reverseIteratorFunction,
                                      IntSupplier sizeFunction,
                                      Predicate containsFunction,
                                      Supplier getFirstFunction,
                                      Supplier getLastFunction, int characteristics) {
        super(iteratorFunction, sizeFunction, containsFunction, characteristics);
        this.getFirstFunction = getFirstFunction;
        this.getLastFunction = getLastFunction;
        this.reverseIteratorFunction = reverseIteratorFunction;
    }


    @Override
    public E getFirst() {
        return getFirstFunction.get();
    }

    @Override
    public E getLast() {
        return getLastFunction.get();
    }

    @Override
    public ReadOnlySequencedSet readOnlyReversed() {
        return new ReadOnlySequencedSetFacade<>(
                reverseIteratorFunction,
                iteratorFunction,
                sizeFunction,
                containsFunction,
                getLastFunction,
                getFirstFunction,
                super.characteristics);
    }
}