forked from M-Labs/artiq
compiler.types: implement map.
This commit is contained in:
parent
e2f7d1047d
commit
3b529c6f90
|
@ -78,6 +78,9 @@ class TVar(Type):
|
||||||
else:
|
else:
|
||||||
return self.find().fold(accum, fn)
|
return self.find().fold(accum, fn)
|
||||||
|
|
||||||
|
def map(self, fn):
|
||||||
|
return fn(self)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
if self.parent is self:
|
if self.parent is self:
|
||||||
return "<artiq.compiler.types.TVar %d>" % id(self)
|
return "<artiq.compiler.types.TVar %d>" % id(self)
|
||||||
|
@ -122,6 +125,21 @@ class TMono(Type):
|
||||||
accum = self.params[param].fold(accum, fn)
|
accum = self.params[param].fold(accum, fn)
|
||||||
return fn(accum, self)
|
return fn(accum, self)
|
||||||
|
|
||||||
|
def map(self, fn):
|
||||||
|
params = OrderedDict()
|
||||||
|
for param in self.params:
|
||||||
|
params[param] = self.params[param].map(fn)
|
||||||
|
|
||||||
|
attributes = OrderedDict()
|
||||||
|
for attr in self.attributes:
|
||||||
|
attributes[attr] = self.attributes[attr].map(fn)
|
||||||
|
|
||||||
|
self_copy = self.__class__.__new__(self.__class__)
|
||||||
|
self_copy.name = self.name
|
||||||
|
self_copy.params = params
|
||||||
|
self_copy.attributes = attributes
|
||||||
|
return fn(self_copy)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "artiq.compiler.types.TMono(%s, %s)" % (repr(self.name), repr(self.params))
|
return "artiq.compiler.types.TMono(%s, %s)" % (repr(self.name), repr(self.params))
|
||||||
|
|
||||||
|
@ -168,6 +186,9 @@ class TTuple(Type):
|
||||||
accum = elt.fold(accum, fn)
|
accum = elt.fold(accum, fn)
|
||||||
return fn(accum, self)
|
return fn(accum, self)
|
||||||
|
|
||||||
|
def map(self, fn):
|
||||||
|
return fn(TTuple(list(map(lambda elt: elt.map(fn), self.elts))))
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "artiq.compiler.types.TTuple(%s)" % repr(self.elts)
|
return "artiq.compiler.types.TTuple(%s)" % repr(self.elts)
|
||||||
|
|
||||||
|
@ -236,6 +257,23 @@ class TFunction(Type):
|
||||||
accum = self.ret.fold(accum, fn)
|
accum = self.ret.fold(accum, fn)
|
||||||
return fn(accum, self)
|
return fn(accum, self)
|
||||||
|
|
||||||
|
def _map_args(self, fn):
|
||||||
|
args = OrderedDict()
|
||||||
|
for arg in self.args:
|
||||||
|
args[arg] = self.args[arg].map(fn)
|
||||||
|
|
||||||
|
optargs = OrderedDict()
|
||||||
|
for optarg in self.optargs:
|
||||||
|
optargs[optarg] = self.optargs[optarg].map(fn)
|
||||||
|
|
||||||
|
return args, optargs, self.ret.map(fn)
|
||||||
|
|
||||||
|
def map(self, fn):
|
||||||
|
args, optargs, ret = self._map_args(fn)
|
||||||
|
self_copy = TFunction(args, optargs, ret)
|
||||||
|
self_copy.delay = self.delay.map(fn)
|
||||||
|
return fn(self_copy)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "artiq.compiler.types.TFunction({}, {}, {})".format(
|
return "artiq.compiler.types.TFunction({}, {}, {})".format(
|
||||||
repr(self.args), repr(self.optargs), repr(self.ret))
|
repr(self.args), repr(self.optargs), repr(self.ret))
|
||||||
|
@ -274,6 +312,12 @@ class TRPCFunction(TFunction):
|
||||||
else:
|
else:
|
||||||
raise UnificationError(self, other)
|
raise UnificationError(self, other)
|
||||||
|
|
||||||
|
def map(self, fn):
|
||||||
|
args, optargs, ret = self._map_args(fn)
|
||||||
|
self_copy = TRPCFunction(args, optargs, ret, self.service)
|
||||||
|
self_copy.delay = self.delay.map(fn)
|
||||||
|
return fn(self_copy)
|
||||||
|
|
||||||
class TCFunction(TFunction):
|
class TCFunction(TFunction):
|
||||||
"""
|
"""
|
||||||
A function type of a runtime-provided C function.
|
A function type of a runtime-provided C function.
|
||||||
|
@ -297,6 +341,12 @@ class TCFunction(TFunction):
|
||||||
else:
|
else:
|
||||||
raise UnificationError(self, other)
|
raise UnificationError(self, other)
|
||||||
|
|
||||||
|
def map(self, fn):
|
||||||
|
args, _optargs, ret = self._map_args(fn)
|
||||||
|
self_copy = TCFunction(args, ret, self.name)
|
||||||
|
self_copy.delay = self.delay.map(fn)
|
||||||
|
return fn(self_copy)
|
||||||
|
|
||||||
class TBuiltin(Type):
|
class TBuiltin(Type):
|
||||||
"""
|
"""
|
||||||
An instance of builtin type. Every instance of a builtin
|
An instance of builtin type. Every instance of a builtin
|
||||||
|
@ -318,6 +368,9 @@ class TBuiltin(Type):
|
||||||
def fold(self, accum, fn):
|
def fold(self, accum, fn):
|
||||||
return fn(accum, self)
|
return fn(accum, self)
|
||||||
|
|
||||||
|
def map(self, fn):
|
||||||
|
return fn(self)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "artiq.compiler.types.{}({})".format(type(self).__name__, repr(self.name))
|
return "artiq.compiler.types.{}({})".format(type(self).__name__, repr(self.name))
|
||||||
|
|
||||||
|
@ -409,6 +462,9 @@ class TValue(Type):
|
||||||
def fold(self, accum, fn):
|
def fold(self, accum, fn):
|
||||||
return fn(accum, self)
|
return fn(accum, self)
|
||||||
|
|
||||||
|
def map(self, fn):
|
||||||
|
return fn(self)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "artiq.compiler.types.TValue(%s)" % repr(self.value)
|
return "artiq.compiler.types.TValue(%s)" % repr(self.value)
|
||||||
|
|
||||||
|
@ -456,6 +512,10 @@ class TDelay(Type):
|
||||||
# delay types do not participate in folding
|
# delay types do not participate in folding
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def map(self, fn):
|
||||||
|
# or mapping
|
||||||
|
return self
|
||||||
|
|
||||||
def __eq__(self, other):
|
def __eq__(self, other):
|
||||||
return isinstance(other, TDelay) and \
|
return isinstance(other, TDelay) and \
|
||||||
(self.duration == other.duration and \
|
(self.duration == other.duration and \
|
||||||
|
|
Loading…
Reference in New Issue