class ReduceCaller(CompoundTypeNode): def __init__(self, frame, anchor, func, seq, initial): self.frame = frame self.anchor = anchor self.received = set() self.elem = IterElement(frame, anchor, seq) self.result = CompoundTypeNode() if initial: initial.connect(self.result.recv) else: self.elem.connect(self.result.recv) self.args = (self.result, self.elem) CompoundTypeNode.__init__(self, [self.result]) func.connect(self.recv_func) return def recv_func(self, src): for obj in src: if obj in self.received: continue self.received.add(obj) try: result = obj.call(self.frame, self.anchor, self.args, {}) result.connect(self.recv) result.connect(self.result.recv) except NodeTypeError: self.frame.raise_expt(ErrorConfig.NotCallable(obj)) return
def accept_arg(self, frame, anchor, i, arg1): if arg1 in self.cache_extend: elem = self.cache_extend[arg1] else: elem = IterElement(frame, anchor, arg1) self.cache_extend[arg1] = elem elem.connect(self.target.elemall.recv) return
def recv_pair(self, src): for obj in src: if obj.is_type(TupleType.get_typeobj()) and obj.elements: if len(obj.elements) == 2: (k,v) = obj.elements k.connect(self.target.key.recv) v.connect(self.target.value.recv) else: self.frame.raise_expt(ErrorConfig.NotConvertable('(key,value)')) continue elem = IterElement(self.frame, self.anchor, obj) elem.connect(self.target.key.recv) elem.connect(self.target.value.recv) self.frame.raise_expt(ErrorConfig.NotConvertable('dict')) return
def recv_pair(self, src): for obj in src: if obj.is_type(TupleType.get_typeobj()) and obj.elements: if len(obj.elements) == 2: (k, v) = obj.elements k.connect(self.target.key.recv) v.connect(self.target.value.recv) else: self.frame.raise_expt( ErrorConfig.NotConvertable('(key,value)')) continue elem = IterElement(self.frame, self.anchor, obj) elem.connect(self.target.key.recv) elem.connect(self.target.value.recv) self.frame.raise_expt(ErrorConfig.NotConvertable('dict')) return
class SumCaller(CompoundTypeNode): def __init__(self, frame, anchor, seq, initial): self.frame = frame self.anchor = anchor self.received = set() self.elem = IterElement(frame, anchor, seq) self.result = CompoundTypeNode() if initial: initial.connect(self.result.recv) else: self.elem.connect(self.result.recv) CompoundTypeNode.__init__(self, [self.result]) IterElement(frame, anchor, seq).connect(self.recv_elem) return def recv_elem(self, src): for obj in src: if obj in self.received: continue self.received.add(obj) BinaryOp(self.frame, self.anchor, 'Add', obj, self.result).connect(self.result.recv) return