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

me.lucko.helper.cooldown.ComposedCooldownMapImpl Maven / Gradle / Ivy

There is a newer version: 5.6.14
Show newest version
/*
 * This file is part of helper, licensed under the MIT License.
 *
 *  Copyright (c) lucko (Luck) 
 *  Copyright (c) contributors
 *
 *  Permission is hereby granted, free of charge, to any person obtaining a copy
 *  of this software and associated documentation files (the "Software"), to deal
 *  in the Software without restriction, including without limitation the rights
 *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 *  copies of the Software, and to permit persons to whom the Software is
 *  furnished to do so, subject to the following conditions:
 *
 *  The above copyright notice and this permission notice shall be included in all
 *  copies or substantial portions of the Software.
 *
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 *  SOFTWARE.
 */

package me.lucko.helper.cooldown;

import com.google.common.base.Preconditions;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;

import java.util.Map;
import java.util.OptionalLong;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;

import javax.annotation.Nonnull;

class ComposedCooldownMapImpl implements ComposedCooldownMap {

    private final Cooldown base;
    private final LoadingCache cache;
    private final Function composeFunction;

    ComposedCooldownMapImpl(Cooldown base, Function composeFunction) {
        this.base = base;
        this.composeFunction = composeFunction;
        this.cache = CacheBuilder.newBuilder()
                // remove from the cache 10 seconds after the cooldown expires
                .expireAfterAccess(base.getTimeout() + 10000L, TimeUnit.MILLISECONDS)
                .build(new CacheLoader() {
                    @Override
                    public Cooldown load(@Nonnull O key) {
                        return base.copy();
                    }
                });
    }

    @Nonnull
    @Override
    public Cooldown getBase() {
        return base;
    }

    /**
     * Gets the internal cooldown instance associated with the given key
     *
     * 

The inline Cooldown methods in this class should be used to access the functionality of the cooldown as opposed * to calling the methods directly via the instance returned by this method.

* * @param key the key * @return a cooldown instance */ @Nonnull public Cooldown get(@Nonnull I key) { Preconditions.checkNotNull(key, "key"); return cache.getUnchecked(composeFunction.apply(key)); } @Override public void put(@Nonnull O key, @Nonnull Cooldown cooldown) { Preconditions.checkNotNull(key, "key"); Preconditions.checkArgument(cooldown.getTimeout() == base.getTimeout(), "different timeout"); cache.put(key, cooldown); } /** * Gets the cooldowns contained within this collection. * * @return the backing map */ @Nonnull public Map getAll() { return cache.asMap(); } /* methods from Cooldown */ @Override public boolean test(@Nonnull I key) { return get(key).test(); } @Override public boolean testSilently(@Nonnull I key) { return get(key).testSilently(); } @Override public long elapsed(@Nonnull I key) { return get(key).elapsed(); } @Override public void reset(@Nonnull I key) { get(key).reset(); } @Override public long remainingMillis(@Nonnull I key) { return get(key).remainingMillis(); } @Override public long remainingTime(@Nonnull I key, @Nonnull TimeUnit unit) { return get(key).remainingTime(unit); } @Nonnull @Override public OptionalLong getLastTested(@Nonnull I key) { return get(key).getLastTested(); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy