Implemented RoundRobinPicker

This commit is contained in:
Andrey Terentev 2024-01-11 18:27:23 +07:00
parent cfab86b94a
commit ee21843a5f

View File

@ -0,0 +1,48 @@
package ru.dragonestia.picker.repository.impl.picker;
import ru.dragonestia.picker.model.Room;
import ru.dragonestia.picker.model.User;
import ru.dragonestia.picker.repository.UserRepository;
import ru.dragonestia.picker.repository.impl.collection.QueuedLinkedList;
import java.util.Collection;
public class RoundRobinPicker implements Picker<Room, User> {
private final UserRepository userRepository;
private final QueuedLinkedList<RoomWrapper> list = new QueuedLinkedList<>();
public RoundRobinPicker(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public void add(Room room) {
synchronized (list) {
list.add(new RoomWrapper(room, () -> userRepository.usersOf(room).size()));
}
}
@Override
public void remove(Room room) {
synchronized (list) {
list.removeById(room.getId());
}
}
@Override
public Room pick(Collection<User> users) {
int amount = users.size();
RoomWrapper wrapper;
synchronized (list) {
try {
while (!(wrapper = list.pick()).canAddUnits(amount));
} catch (RuntimeException ex) {
throw new RuntimeException("There are no rooms available");
}
}
return wrapper.getItem();
}
}