mirror of
https://github.com/erg-lang/erg.git
synced 2025-09-29 12:24:45 +00:00
Fix subtyping bug
This commit is contained in:
parent
978866b31a
commit
c39973f536
7 changed files with 110 additions and 19 deletions
|
@ -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):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue