/*
 * Copyright (c) 2015 The original author or authors
 * ---------------------------------
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and Apache License v2.0 which accompanies this distribution.
 *
 * The Eclipse Public License is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * The Apache License v2.0 is available at
 * http://www.opensource.org/licenses/apache2.0.php
 *
 * You may elect to redistribute this code under either of these licenses.
 */

package io.vertx.spi.cluster.ignite.impl;

import io.vertx.core.spi.cluster.ChoosableIterable;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;

ChoosableIterable implementation.
Author:Andrey Gura
/** * ChoosableIterable implementation. * * @author Andrey Gura */
class ChoosableIterableImpl<T> implements ChoosableIterable<T> { private static final ChoosableIterable<Object> EMPTY = new ChoosableIterable<Object>() { @Override public boolean isEmpty() { return true; } @Override public Object choose() { return null; } @Override public Iterator<Object> iterator() { return Collections.emptyIterator(); } }; private final AtomicReference<List<T>> itemsRef; private AtomicInteger chooseCnt = new AtomicInteger(); public ChoosableIterableImpl(List<T> items) { this.itemsRef = new AtomicReference<>(Objects.requireNonNull(items, "items")); } public void update(List<T> items) { itemsRef.set(Objects.requireNonNull(items, "items")); } @Override public boolean isEmpty() { return itemsRef.get().isEmpty(); } @Override public Iterator<T> iterator() { return itemsRef.get().iterator(); } @Override public T choose() { List<T> items = itemsRef.get(); if (items.isEmpty()) { return null; } return items.get(Math.abs(chooseCnt.getAndIncrement()) % items.size()); } public static <T> ChoosableIterable<T> empty() { return (ChoosableIterable<T>)EMPTY; } }