mirror of
https://github.com/erg-lang/erg.git
synced 2025-08-04 02:39:20 +00:00
160 lines
3.9 KiB
Python
160 lines
3.9 KiB
Python
from _erg_result import Error
|
|
from _erg_control import then__
|
|
|
|
|
|
class Int(int):
|
|
def try_new(i): # -> Result[Nat]
|
|
if isinstance(i, int):
|
|
Int(i)
|
|
else:
|
|
Error("not an integer")
|
|
|
|
def succ(self):
|
|
return Int(self + 1)
|
|
|
|
def pred(self):
|
|
return Int(self - 1)
|
|
|
|
def mutate(self):
|
|
return IntMut(self)
|
|
|
|
def __add__(self, other):
|
|
return then__(int.__add__(self, other), Int)
|
|
|
|
def __radd__(self, other):
|
|
return then__(int.__add__(other, self), Int)
|
|
|
|
def __sub__(self, other):
|
|
return then__(int.__sub__(self, other), Int)
|
|
|
|
def __rsub__(self, other):
|
|
return then__(int.__sub__(other, self), Int)
|
|
|
|
def __mul__(self, other):
|
|
return then__(int.__mul__(self, other), Int)
|
|
|
|
def __rmul__(self, other):
|
|
return then__(int.__mul__(other, self), Int)
|
|
|
|
def __div__(self, other):
|
|
return then__(int.__div__(self, other), Int)
|
|
|
|
def __rdiv__(self, other):
|
|
return then__(int.__div__(other, self), Int)
|
|
|
|
def __floordiv__(self, other):
|
|
return then__(int.__floordiv__(self, other), Int)
|
|
|
|
def __rfloordiv__(self, other):
|
|
return then__(int.__floordiv__(other, self), Int)
|
|
|
|
def __pow__(self, other):
|
|
return then__(int.__pow__(self, other), Int)
|
|
|
|
def __rpow__(self, other):
|
|
return then__(int.__pow__(other, self), Int)
|
|
|
|
def __pos__(self):
|
|
return self
|
|
|
|
def __neg__(self):
|
|
return then__(int.__neg__(self), Int)
|
|
|
|
|
|
class IntMut: # inherits Int
|
|
value: Int
|
|
|
|
def __init__(self, i):
|
|
self.value = Int(i)
|
|
def __int__(self):
|
|
return self.value.__int__()
|
|
|
|
def __repr__(self):
|
|
return self.value.__repr__()
|
|
|
|
def __hash__(self):
|
|
return self.value.__hash__()
|
|
|
|
def __eq__(self, other):
|
|
if isinstance(other, Int):
|
|
return self.value == other
|
|
else:
|
|
return self.value == other.value
|
|
|
|
def __ne__(self, other):
|
|
if isinstance(other, Int):
|
|
return self.value != other
|
|
else:
|
|
return self.value != other.value
|
|
|
|
def __le__(self, other):
|
|
if isinstance(other, Int):
|
|
return self.value <= other
|
|
else:
|
|
return self.value <= other.value
|
|
|
|
def __ge__(self, other):
|
|
if isinstance(other, Int):
|
|
return self.value >= other
|
|
else:
|
|
return self.value >= other.value
|
|
|
|
def __lt__(self, other):
|
|
if isinstance(other, Int):
|
|
return self.value < other
|
|
else:
|
|
return self.value < other.value
|
|
|
|
def __gt__(self, other):
|
|
if isinstance(other, Int):
|
|
return self.value > other
|
|
else:
|
|
return self.value > other.value
|
|
|
|
def __add__(self, other):
|
|
if isinstance(other, Int):
|
|
return IntMut(self.value + other)
|
|
else:
|
|
return IntMut(self.value + other.value)
|
|
|
|
def __sub__(self, other):
|
|
if isinstance(other, Int):
|
|
return IntMut(self.value - other)
|
|
else:
|
|
return IntMut(self.value - other.value)
|
|
|
|
def __mul__(self, other):
|
|
if isinstance(other, Int):
|
|
return IntMut(self.value * other)
|
|
else:
|
|
return IntMut(self.value * other.value)
|
|
|
|
def __floordiv__(self, other):
|
|
if isinstance(other, Int):
|
|
return IntMut(self.value // other)
|
|
else:
|
|
return IntMut(self.value // other.value)
|
|
|
|
def __pow__(self, other):
|
|
if isinstance(other, Int):
|
|
return IntMut(self.value**other)
|
|
else:
|
|
return IntMut(self.value**other.value)
|
|
|
|
def __pos__(self):
|
|
return self
|
|
|
|
def __neg__(self):
|
|
return IntMut(-self.value)
|
|
|
|
def inc(self, i=1):
|
|
self.value = Int(self.value + i)
|
|
|
|
def dec(self, i=1):
|
|
self.value = Int(self.value - i)
|
|
|
|
def succ(self):
|
|
return self.value.succ()
|
|
|
|
def pred(self):
|
|
return self.value.pred()
|