aboutsummaryrefslogtreecommitdiffstats
path: root/bot/utils/randomization.py
blob: c9eabbd2428cb7167a4655e5cc4d8629f23242c4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import itertools
import random
from collections.abc import Iterable
from typing import Any


class RandomCycle:
    """
    Cycles through elements from a randomly shuffled iterable, repeating indefinitely.

    The iterable is reshuffled after each full cycle.
    """

    def __init__(self, iterable: Iterable):
        self.iterable = list(iterable)
        self.index = itertools.cycle(range(len(iterable)))

    def __next__(self) -> Any:
        idx = next(self.index)

        if idx == 0:
            random.shuffle(self.iterable)

        return self.iterable[idx]