Exemplo n.º 1
0
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
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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