92 lines
1.8 KiB
Python
92 lines
1.8 KiB
Python
|
|
"""
|
|
Could this be valid Python?
|
|
|
|
if now >= T[4:20:PM]: chill()
|
|
|
|
|
|
>>> t = T[4:20]
|
|
>>> t
|
|
T[4:20]
|
|
>>> h, m, s = t
|
|
>>> h, m, s
|
|
(4, 20, 0)
|
|
>>> t[11:59:AM]
|
|
T[11:59:AM]
|
|
>>> start = t[9:O1:PM]
|
|
>>> start
|
|
T[9:O1:PM]
|
|
>>> start.h, start.m, start.s, start.pm
|
|
(9, 1, 0, True)
|
|
>>> now = T[7:O1:PM]
|
|
>>> T[4:OO:PM]
|
|
T[4:OO:PM]
|
|
>>> now > T[4:20:PM]
|
|
True
|
|
"""
|
|
|
|
import functools
|
|
|
|
AM = -2
|
|
PM = -1
|
|
|
|
for n in range(10):
|
|
globals()[f'O{n}'] = n
|
|
OO = 0
|
|
|
|
@functools.total_ordering
|
|
class T():
|
|
|
|
def __init__(self, arg):
|
|
if isinstance(arg, slice):
|
|
h = arg.start or 0
|
|
m = arg.stop or 0
|
|
s = arg.step or 0
|
|
else:
|
|
h, m, s = 0, 0, arg
|
|
if m in (AM, PM):
|
|
self.pm = m == PM
|
|
m = 0
|
|
elif s in (AM, PM):
|
|
self.pm = s == PM
|
|
s = 0
|
|
else:
|
|
self.pm = None
|
|
self.h, self.m, self.s = h, m, s
|
|
|
|
def __class_getitem__(cls, arg):
|
|
return cls(arg)
|
|
|
|
def __getitem__(self, arg):
|
|
return(type(self)(arg))
|
|
|
|
def __repr__(self):
|
|
h, m, s = self.h, self.m, self.s or None
|
|
if m == 0:
|
|
m = f'OO'
|
|
elif m < 10:
|
|
m = f'O{m}'
|
|
s = '' if s is None else s
|
|
if self.pm is None:
|
|
pm = ''
|
|
else:
|
|
pm = ':' + ('AM', 'PM')[self.pm]
|
|
return f'T[{h}:{m}{s}{pm}]'
|
|
|
|
def __iter__(self):
|
|
yield from (self.h, self.m, self.s)
|
|
|
|
def __eq__(self, other):
|
|
return tuple(self) == tuple(other)
|
|
|
|
def __lt__(self, other):
|
|
return tuple(self) < tuple(other)
|
|
|
|
def __add__(self, other):
|
|
"""
|
|
>>> T[11:O5:AM] + 15 # TODO: preserve pm field
|
|
T[11:20]
|
|
"""
|
|
if isinstance(other, int):
|
|
return self[self.h:self.m + other:self.pm]
|