from _erg_nat import Nat from _erg_str import Str # from collections.abc import Iterable, Sequence, Iterator, Container 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") # TODO: for Str, etc. def __len__(self): 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) # Sequence.register(Range) # Container.register(Range) # Iterable.register(Range) # represents `start<..end` class LeftOpenRange(Range): def __contains__(self, item): return self.start < item <= self.end # represents `start..