Fix subtyping bug

This commit is contained in:
Shunsuke Shibayama 2022-10-21 20:04:14 +09:00
parent 978866b31a
commit c39973f536
7 changed files with 110 additions and 19 deletions

View file

@ -26,7 +26,8 @@ def in_operator(x, y):
return True
# TODO: trait check
return False
elif (type(y) == list or type(y) == set) and type(y[0]) == type:
elif (type(y) == list or type(y) == set) \
and (type(y[0]) == type or issubclass(type(y[0]), Range)):
# FIXME:
type_check = in_operator(x[0], y[0])
len_check = len(x) == len(y)
@ -82,9 +83,26 @@ class Range:
def __contains__(self, item):
pass
def __getitem__(self, item):
pass
res = self.start + item
if res in self:
return res
else:
raise IndexError("Index out of range")
def __len__(self):
pass
if self.start in self:
if self.end in self:
# len(1..4) == 4
return self.end - self.start + 1
else:
# len(1..<4) == 3
return self.end - self.start
else:
if self.end in self:
# len(1<..4) == 3
return self.end - self.start
else:
# len(1<..<4) == 2
return self.end - self.start - 2
def __iter__(self):
return RangeIterator(rng=self)
@ -96,37 +114,21 @@ Iterable.register(Range)
class LeftOpenRange(Range):
def __contains__(self, item):
return self.start < item <= self.end
def __getitem__(self, item):
return NotImplemented
def __len__(self):
return NotImplemented
# represents `start..<end`
class RightOpenRange(Range):
def __contains__(self, item):
return self.start <= item < self.end
def __getitem__(self, item):
return NotImplemented
def __len__(self):
return NotImplemented
# represents `start<..<end`
class OpenRange(Range):
def __contains__(self, item):
return self.start < item < self.end
def __getitem__(self, item):
return NotImplemented
def __len__(self):
return NotImplemented
# represents `start..end`
class ClosedRange(Range):
def __contains__(self, item):
return self.start <= item <= self.end
def __getitem__(self, item):
return NotImplemented
def __len__(self):
return NotImplemented
class RangeIterator:
def __init__(self, rng):