package com.airbnb.airpal.api; import com.google.common.collect.ForwardingBlockingDeque; import java.util.concurrent.BlockingDeque; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.TimeUnit; public class EvictingDeque<E> extends ForwardingBlockingDeque<E> { private final LinkedBlockingDeque<E> blockingDeque; public EvictingDeque(final int capacity) { this.blockingDeque = new LinkedBlockingDeque<>(capacity); } @Override public void put(E e) throws InterruptedException { this.add(e); } @Override public boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException { return this.add(e); } @Override public boolean add(E element) { final boolean initialResult = blockingDeque.offer(element); return initialResult || (evictItem(blockingDeque) && add(element)); } @Override protected BlockingDeque<E> delegate() { return blockingDeque; } protected boolean evictItem(LinkedBlockingDeque<E> deque) { return deque.remove() != null; } }