>>> adds = [[11, 1], [32, 1]] >>> dels = [[11, 11], [31, 32]] >>> _inverse_diff_result(adds, dels) ([[10, 1], [30, 2]], [[11, 11], [31, 31]])
(adds, dels)
| 12 | |
| 13 | |
| 14 | def _inverse_diff_result(adds, dels): |
| 15 | """ |
| 16 | >>> adds = [[11, 1], [32, 1]] |
| 17 | >>> dels = [[11, 11], [31, 32]] |
| 18 | >>> _inverse_diff_result(adds, dels) |
| 19 | ([[10, 1], [30, 2]], [[11, 11], [31, 31]]) |
| 20 | """ |
| 21 | diff = 0 |
| 22 | add_ptr, del_ptr = 0, 0 |
| 23 | num_adds, num_dels = len(adds), len(dels) |
| 24 | inv_adds, inv_dels = [], [] |
| 25 | |
| 26 | def _handle_a(a): |
| 27 | nonlocal diff |
| 28 | inv_dels.append([diff + a[0] + 1, diff + a[0] + a[1]]) |
| 29 | diff += a[1] |
| 30 | |
| 31 | def _handle_d(d): |
| 32 | nonlocal diff |
| 33 | inv_adds.append([diff + d[0] - 1, d[1] - d[0] + 1]) |
| 34 | diff -= (d[1] - d[0] + 1) |
| 35 | |
| 36 | while add_ptr < num_adds or del_ptr < num_dels: |
| 37 | if add_ptr < num_adds and del_ptr < num_dels: |
| 38 | if adds[add_ptr][0] < dels[del_ptr][0]: |
| 39 | _handle_a(adds[add_ptr]) |
| 40 | add_ptr += 1 |
| 41 | else: |
| 42 | _handle_d(dels[del_ptr]) |
| 43 | del_ptr += 1 |
| 44 | elif add_ptr < num_adds and del_ptr >= num_dels: |
| 45 | # we have finished dels |
| 46 | _handle_a(adds[add_ptr]) |
| 47 | add_ptr += 1 |
| 48 | else: |
| 49 | # we have finished adds |
| 50 | _handle_d(dels[del_ptr]) |
| 51 | del_ptr += 1 |
| 52 | |
| 53 | return inv_adds, inv_dels |
| 54 | |
| 55 | |
| 56 | def _normalize_shares(email_to_share): |