forked from Raiza.dev/EliteBot
57 lines
1.7 KiB
Python
57 lines
1.7 KiB
Python
from ..utils import str_coercible
|
|
from .weekday import WeekDay
|
|
|
|
|
|
@str_coercible
|
|
class WeekDays:
|
|
def __init__(self, bit_string_or_week_days):
|
|
if isinstance(bit_string_or_week_days, str):
|
|
self._days = set()
|
|
|
|
if len(bit_string_or_week_days) != WeekDay.NUM_WEEK_DAYS:
|
|
raise ValueError(
|
|
'Bit string must be {} characters long.'.format(
|
|
WeekDay.NUM_WEEK_DAYS
|
|
)
|
|
)
|
|
|
|
for index, bit in enumerate(bit_string_or_week_days):
|
|
if bit not in '01':
|
|
raise ValueError(
|
|
'Bit string may only contain zeroes and ones.'
|
|
)
|
|
if bit == '1':
|
|
self._days.add(WeekDay(index))
|
|
elif isinstance(bit_string_or_week_days, WeekDays):
|
|
self._days = bit_string_or_week_days._days
|
|
else:
|
|
self._days = set(bit_string_or_week_days)
|
|
|
|
def __eq__(self, other):
|
|
if isinstance(other, WeekDays):
|
|
return self._days == other._days
|
|
elif isinstance(other, str):
|
|
return self.as_bit_string() == other
|
|
else:
|
|
return NotImplemented
|
|
|
|
def __iter__(self):
|
|
yield from sorted(self._days)
|
|
|
|
def __contains__(self, value):
|
|
return value in self._days
|
|
|
|
def __repr__(self):
|
|
return '{}({!r})'.format(
|
|
self.__class__.__name__,
|
|
self.as_bit_string()
|
|
)
|
|
|
|
def __unicode__(self):
|
|
return ', '.join(str(day) for day in self)
|
|
|
|
def as_bit_string(self):
|
|
return ''.join(
|
|
'1' if WeekDay(index) in self._days else '0'
|
|
for index in range(WeekDay.NUM_WEEK_DAYS)
|
|
)
|