def Group(g, b_type=None): ef = None def prepare(): for l in ef.listeners.itervalues(): l.prepare() for e in ef.table.values(): e.fresh = False for l in e.listeners.itervalues(): l.prepare() def push(x): y = g(x) e = None if not (ef.table.has_key(y)): e = FEvent() ef.table[y] = e for l in ef.listeners.itervalues(): l.push((y, e)) else: e = ef.table[y] for l in e.listeners.itervalues(): l.push(x) def finish(): for e in ef.table.values(): for l in e.listeners.itervalues(): l.finish() e.fresh = True for l in ef.listeners.itervalues(): l.finish() def terminate(): for e in ef.table.values(): for l in e.listeners.itervalues(): l.terminate() for l in ef.listeners.itervalues(): l.terminate() def type_fun(a): if a is not None and b_type is not None: return types.FType((b_type.type, types.FEventType(a.type))) else: return None ef = FEventFun(prepare=prepare, push=push, finish=finish, terminate=terminate, type_fun=type_fun) ef.table = {} return ef
def Ungroup(n, f, init, init_type=None): ef = None def go(x, y): for l in ef.listeners.itervalues(): l.push((x, y)) def mk_lpush(e): def g(z): (x, i, b, y) = ef.table[e] if not b: y = f(y, z) if not (n is None) and i == n - 1: b = True go(x, y) ef.table[e] = (x, i + 1, b, y) return g def mk_lterm(e): def g(): (x, i, b, y) = ef.table[e] if not b: go(x, y) return g def push((x, e)): ef.table[e] = (x, 0, False, init) e.add_listener(FListener(push=mk_lpush(e), terminate=mk_lterm(e))) def type_fun(t): if t is None or init_type is None: return None try: (c, a) = t.type except (TypeError, ValueError): raise types.FTypeException("%s not an instance of (c * E a)" % a) f_out_type = f.type_fun(types.FType((init_type.type, a.type))) if not types.is_of_type(f_out_type, init_type): raise types.FTypeException( "%s not of expected type: f generates %s instead of %s" % (t, f_out_type, init_type)) return types.FType((c, init_type.type)) ef = FEventFun(push=push, type_fun=type_fun) ef.table = {} return ef
def Group(g, b_type=None): ef = None def prepare(): for l in ef.listeners.itervalues(): l.prepare() for e in ef.table.values(): e.fresh = False for l in e.listeners.itervalues(): l.prepare() def push(x): y = g(x) e = None if not (ef.table.has_key(y)): e = FEvent() ef.table[y] = e for l in ef.listeners.itervalues(): l.push((y,e)) else: e = ef.table[y] for l in e.listeners.itervalues(): l.push(x) def finish(): for e in ef.table.values(): for l in e.listeners.itervalues(): l.finish() e.fresh = True for l in ef.listeners.itervalues(): l.finish() def terminate(): for e in ef.table.values(): for l in e.listeners.itervalues(): l.terminate() for l in ef.listeners.itervalues(): l.terminate() def type_fun(a): if a is not None and b_type is not None: return types.FType((b_type.type, types.FEventType(a.type))) else: return None ef = FEventFun(prepare=prepare, push=push, finish=finish, terminate=terminate, type_fun=type_fun) ef.table = {} return ef
def Ungroup(n,f,init, init_type=None): ef = None def go(x,y): for l in ef.listeners.itervalues(): l.push((x,y)) def mk_lpush(e): def g(z): (x,i,b,y) = ef.table[e] if not b: y = f(y,z) if not (n is None) and i == n - 1: b = True go(x,y) ef.table[e] = (x,i+1,b,y) return g def mk_lterm(e): def g(): (x,i,b,y) = ef.table[e] if not b: go(x,y) return g def push((x,e)): ef.table[e] = (x,0,False,init) e.add_listener(FListener(push=mk_lpush(e),terminate=mk_lterm(e))) def type_fun(t): if t is None or init_type is None: return None try: (c, a) = t.type except (TypeError, ValueError): raise types.FTypeException("%s not an instance of (c * E a)" % a) f_out_type = f.type_fun(types.FType((init_type.type, a.type))) if not types.is_of_type(f_out_type, init_type): raise types.FTypeException( "%s not of expected type: f generates %s instead of %s" % (t, f_out_type, init_type)) return types.FType((c, init_type.type)) ef = FEventFun(push=push,type_fun=type_fun) ef.table = {} return ef