[PEAK] Computed sets

Sergey Schetinin maluke at gmail.com
Sat Mar 14 01:56:49 EDT 2009


It seems that the case when the same item is added to one source set
of a UnionSet and removed from another, isn't handled: that item would
appear on both .added and .removed.

If it were only for .added and .removed attributes I'd go for a
@maintain(make=Set)
def set3(self):
    s = self.set3
    s.clear()
    s.update(self.set1)
    s.update(self.set2)
    return s




On Sat, Mar 14, 2009 at 04:22, Adam Atlas <adam at atlas.st> wrote:
> I'm writing a module based on Trellis which provides several Set-like
> objects, which can generally be used like Set or FrozenSet (plus the Trellis
> .added and .removed attributes) but are generated dynamically from some
> source sets, either by filtering one source set or by applying some standard
> set operation (union, intersect, difference, symmetric difference) to two
> source sets. The idea is to do this more efficiently by watching for changes
> in the source sets and changing the computed set appropriately, rather than
> having, say, a trellis.compute(lambda self: self.set1.union(self.set2)),
> which would require the whole set to be rebuilt any time set1 or set2 change
> at all, and also wouldn't expose the .added and .removed attributes.
>
> So here's how I'm doing it right now. Before I go further I just thought I'd
> post it here to see if I'm on the right track, or if there's anything wrong
> with this general approach.
>
>
> class FilteredSubset(sets.BaseSet, trellis.Component):
>    source = trellis.make(trellis.Set, writable=True)
>    condition = trellis.attr(lambda self, val: True)
>    _data = trellis.Set._data
>
>    def __init__(self, source=None, condition=None, **kw):
>        trellis.Component.__init__(self, **kw)
>        if condition is not None:
>            self.condition = condition
>        if source is not None:
>            self.source = source
>            self._data.update((k, True) for k in source._data if
> self.condition(k))
>
>    @trellis.compute
>    def added(self):
>        return set(k for k in self.source.added if self.condition(k))
>
>    @trellis.compute
>    def removed(self):
>        return set(k for k in self.source.removed if k in self)
>
>
>
> class UnionSet(sets.BaseSet, trellis.Component):
>    source1 = trellis.make(trellis.Set, writable=True)
>    source2 = trellis.make(trellis.Set, writable=True)
>    _data = trellis.Set._data
>
>    def __init__(self, source1=None, source2=None, **kw):
>        trellis.Component.__init__(self, **kw)
>        if source1 is not None:
>            self.source1 = source1
>            self._data.update(dict.fromkeys(source1, True))
>        if source2 is not None:
>            self.source2 = source2
>            self._data.update(dict.fromkeys(source2, True))
>
>    @trellis.compute
>    def added(self):
>        '''
>        something is added to UnionSet if it is added to at least one source
>        set and it was not already in either source set
>        '''
>        return self.source1.added.difference(self.source2).union(
>            self.source2.added.difference(self.source1))
>
>    @trellis.compute
>    def removed(self):
>        '''
>        something is removed from UnionSet if it is removed from both source
>        sets, or if it is removed from one source set and it is not in the
>        other source set
>        '''
>        return self.source1.removed.difference(self.source2).union(
>            self.source2.removed.difference(self.source1))
> _______________________________________________
> PEAK mailing list
> PEAK at eby-sarna.com
> http://www.eby-sarna.com/mailman/listinfo/peak
>



-- 
Best Regards,
Sergey Schetinin

http://s3bk.com/ -- S3 Backup
http://word-to-html.com/ -- Word to HTML Converter


More information about the PEAK mailing list