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

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

The newest version!
/*
 * @(#)ReadOnlySequencedMapFacade.java
 * Copyright © 2023 The authors and contributors of JHotDraw. MIT License.
 */

package org.jhotdraw8.icollection.facade;

import org.jhotdraw8.icollection.readonly.ReadOnlySequencedMap;
import org.jspecify.annotations.Nullable;

import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.SequencedMap;
import java.util.Spliterator;
import java.util.function.Function;
import java.util.function.IntSupplier;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * Provides a {@link ReadOnlySequencedMap} facade to a set of {@code ReadOnlySequencedMap} functions.
 *
 * @param  the key type
 * @param  the value type
 * @author Werner Randelshofer
 */
public class ReadOnlySequencedMapFacade extends ReadOnlyMapFacade
        implements ReadOnlySequencedMap {
    private final Supplier> firstEntryFunction;
    private final Supplier> lastEntryFunction;
    private final Supplier>> reverseIteratorFunction;
    private final int characteristics;
    private final @Nullable Comparator comparator;

    public ReadOnlySequencedMapFacade(SequencedMap target) {
        super(target);
        this.firstEntryFunction = target::firstEntry;
        this.lastEntryFunction = target::lastEntry;
        this.reverseIteratorFunction = () -> target.reversed().sequencedEntrySet().iterator();
        this.characteristics = Spliterator.ORDERED | Spliterator.SIZED | Spliterator.DISTINCT;
        this.comparator = null;
    }

    public ReadOnlySequencedMapFacade(
            Supplier>> iteratorFunction,
            Supplier>> reverseIteratorFunction,
            IntSupplier sizeFunction,
            Predicate containsKeyFunction,
            Function getFunction,
            Supplier> firstEntryFunction,
            Supplier> lastEntryFunction, int characteristics, @Nullable Comparator comparator) {
        super(iteratorFunction, sizeFunction, containsKeyFunction, getFunction);
        this.firstEntryFunction = firstEntryFunction;
        this.lastEntryFunction = lastEntryFunction;
        this.reverseIteratorFunction = reverseIteratorFunction;
        this.characteristics = characteristics;
        this.comparator = comparator;
    }

    @Override
    public ReadOnlySequencedMap readOnlyReversed() {
        return new ReadOnlySequencedMapFacade<>(
                reverseIteratorFunction,
                iteratorFunction,
                sizeFunction,
                containsKeyFunction,
                getFunction,
                lastEntryFunction,
                firstEntryFunction,
                characteristics, comparator);
    }

    @Override
    public Map.@Nullable Entry firstEntry() {
        return firstEntryFunction.get();
    }

    @Override
    public Map.@Nullable Entry lastEntry() {
        return lastEntryFunction.get();
    }

    @Override
    public int characteristics() {
        return characteristics;
    }
}