def apply(func, *mappings):
"""Return a new IntervalMapping applying func to all values of mappings.
For example, apply(lambda x, y: x + y, m1, m2) returns a new
matching with the sum of values for m1 and
m2. IntervalMapping.nothing is passed to func when the value is
undefined.
>>> m1 = IntervalMapping()
>>> m2 = IntervalMapping()
>>> m1[:] = m2[:] = 0 # avoid problems with undefined values
>>> m1[0:2] = 1
>>> m2[1:3] = 2
>>> m3 = apply(lambda a, b: a + b, m1, m2)
>>> m3[-1], m3[0], m3[1], m3[2], m3[3]
(0, 1, 3, 2, 0)
"""
values = [m.leftmost() for m in mappings]
def changes():
def start_i_value(i_m):
i, m = i_m
res = ((k.start, i, v) for k, v in m.iteritems(True))
next(res)
return res
change_points = merge(*map(start_i_value, enumerate(mappings)))
lastbound = None
for bound, i, v in change_points:
values[i] = v
if bound != lastbound:
yield bound, func(*values)
lastbound = bound
yield bound, func(*values)
return IntervalMapping.from_changes(func(*values), changes())
评论列表
文章目录