| 1894 | |
| 1895 | |
| 1896 | class Cycler: |
| 1897 | def __init__(self, values, default=0): |
| 1898 | self.values = values |
| 1899 | if type(default) is not int or default > len(values): |
| 1900 | default = values.index(default) |
| 1901 | self.i = default |
| 1902 | def choose(self, val): |
| 1903 | if val in self.values: |
| 1904 | self.i = self.values.index(val) |
| 1905 | def nxt(self): # not named "next" to prevent using a Cycler as an iterator, which would hang |
| 1906 | self.i = (self.i + 1) % len(self.values) |
| 1907 | return self.value() |
| 1908 | def value(self): |
| 1909 | return self.values[self.i] |
| 1910 | def __str__(self): |
| 1911 | return str(self.value()) |
| 1912 | |
| 1913 | class PercentCycler(Cycler): |
| 1914 | def __str__(self): |