from _erg_nat import Nat
from _erg_str import Str
class Range:
def __init__(self, start, end):
self.start = start
self.end = end
def __contains__(self, item):
pass
@staticmethod
def from_slice(slice):
pass
def into_slice(self):
pass
def __getitem__(self, item):
res = self.start + item
if res in self:
return res
else:
raise IndexError("Index out of range")
def __len__(self):
if self.start in self:
if self.end in self:
return self.end - self.start + 1
else:
return self.end - self.start
else:
if self.end in self:
return self.end - self.start
else:
return self.end - self.start - 2
def __iter__(self):
return RangeIterator(rng=self)
class LeftOpenRange(Range):
def __contains__(self, item):
return self.start < item <= self.end
class RightOpenRange(Range):
def __contains__(self, item):
return self.start <= item < self.end
@staticmethod
def from_slice(slice):
return Range(slice.start, slice.stop)
def into_slice(self):
return slice(self.start, self.end)
class OpenRange(Range):
def __contains__(self, item):
return self.start < item < self.end
class ClosedRange(Range):
def __contains__(self, item):
return self.start <= item <= self.end
@staticmethod
def from_slice(slice):
return Range(slice.start, slice.stop - 1)
def into_slice(self):
return slice(self.start, self.end + 1)
class RangeIterator:
def __init__(self, rng):
self.rng = rng
self.needle = self.rng.start
if issubclass(Nat, type(self.rng.start)):
if self.needle not in self.rng:
self.needle += 1
elif issubclass(Str, type(self.rng.start)):
if self.needle not in self.rng:
self.needle = chr(ord(self.needle) + 1)
else:
if self.needle not in self.rng:
self.needle = self.needle.succ()
def __iter__(self):
return self
def __next__(self):
if issubclass(Nat, type(self.rng.start)):
if self.needle in self.rng:
result = self.needle
self.needle += 1
return result
elif issubclass(Str, type(self.rng.start)):
if self.needle in self.rng:
result = self.needle
self.needle = chr(ord(self.needle) + 1)
return result
else:
if self.needle in self.rng:
result = self.needle
self.needle = self.needle.succ()
return result
raise StopIteration