Implemented RoundRobinPicker
This commit is contained in:
parent
cfab86b94a
commit
ee21843a5f
@ -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();
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user