1.1 --- a/micropython/common.py Sun Aug 28 02:03:04 2011 +0200
1.2 +++ b/micropython/common.py Sun Aug 28 18:30:40 2011 +0200
1.3 @@ -20,6 +20,7 @@
1.4 """
1.5
1.6 import compiler.visitor
1.7 +import operator
1.8
1.9 try:
1.10 set
1.11 @@ -119,31 +120,7 @@
1.12 possible, and incorporating values present in only one of the sets.
1.13 """
1.14
1.15 - merged = ObjectSet()
1.16 - for key in other.keys():
1.17 - if not self.has_key(key):
1.18 - merged[key] = other[key]
1.19 - else:
1.20 - merged[key] = self[key] + other[key]
1.21 -
1.22 - for key in self.keys():
1.23 - if not merged.has_key(key):
1.24 - merged[key] = self[key]
1.25 -
1.26 - return merged
1.27 -
1.28 -def combine_object_set_lists(l1, l2):
1.29 -
1.30 - """
1.31 - Combine lists of object sets 'l1' and 'l2' to make a product of their
1.32 - members.
1.33 - """
1.34 -
1.35 - combined = set([])
1.36 - for i1 in l1:
1.37 - for i2 in l2:
1.38 - combined.add(i1.merge(i2))
1.39 - return combined
1.40 + return combine(self, other, ObjectSet(), operator.add)
1.41
1.42 def deepen_mapping_dict(d):
1.43
1.44 @@ -188,17 +165,22 @@
1.45 -> {'a' : [{'f', 'g'}, {'f', 'h'}, {'e', 'f', 'g'}, {'e', 'f', 'g', 'h'}], ...}
1.46 """
1.47
1.48 - combined = {}
1.49 + return combine(d1, d2, {}, combine_object_set_lists)
1.50 +
1.51 +def combine(d1, d2, combined, combine_op):
1.52 +
1.53 + """
1.54 + Combine dictionaries 'd1' and 'd2' in the 'combined' object provided, using
1.55 + the 'combine_op' to merge values from the dictionaries.
1.56 + """
1.57 +
1.58 d2_keys = d2.keys()
1.59
1.60 for key in d2_keys:
1.61 -
1.62 - d1_values = d1.get(key)
1.63 -
1.64 - if d1_values is None:
1.65 + if not d1.has_key(key):
1.66 combined[key] = d2[key]
1.67 else:
1.68 - combined[key] = combine_object_set_lists(d1_values, d2[key])
1.69 + combined[key] = combine_op(d1[key], d2[key])
1.70
1.71 for key in d1.keys():
1.72 if key not in d2_keys:
1.73 @@ -206,6 +188,19 @@
1.74
1.75 return combined
1.76
1.77 +def combine_object_set_lists(l1, l2):
1.78 +
1.79 + """
1.80 + Combine lists of object sets 'l1' and 'l2' to make a product of their
1.81 + members.
1.82 + """
1.83 +
1.84 + combined = set([])
1.85 + for i1 in l1:
1.86 + for i2 in l2:
1.87 + combined.add(i1.merge(i2))
1.88 + return combined
1.89 +
1.90 # Visitors and activities related to node annotations.
1.91
1.92 class ASTVisitor(compiler.visitor.ASTVisitor):