Re: Re: trellis.Set.discard

"Sergey Schetinin" <[email protected]>
Newsgroups gmane.comp.python.peak
Message-ID <[email protected]>
Here's my take on merging variant:

class MergingValue(Value):
    __slots__ = 'inputs', 'scheduled', 'merge'

    def __init__(self, value=None, discrete=False, merge=None):
        self.inputs = {}
        self.scheduled = False
        if not callable(merge):
            raise TypeError() #@@
        self.merge = merge
        Value.__init__(self, value, discrete)

    @modifier
    def set_value(self, value):
        lock(self)
        cl = ctrl.current_listener
        self.inputs[cl] = value
        on_undo(self.inputs.__delitem__, cl)
        if not self.scheduled:
            change_attr(self, 'scheduled', True)
            on_commit(self.do_merge)

    def get_value(self):
        cl = ctrl.current_listener
        if cl in self.inputs:
            return self.inputs[cl]
        else:
            return Value.get_value(self)

    value = property(get_value, set_value)

    def do_merge(self):
        newval = self.merge(self._value, self.inputs)
        Value.set_value(self, newval)
        self.inputs = {}
        self.scheduled = False

A merge function could look like this:

def sum_merge(val, map):
    return sum(map.itervalues(), val)



I went for a simpler approach than @todo / future, and I didn't write
the decorators for it but still, I already like this better. It seems
to work as expected except for discrete case.

Setting this value doesn't count as a write, because the changes they
don't need to be tracked and will be merged later anyway, so no need
to ever retry.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.