equal
deleted
inserted
replaced
44 def future_set_exception_info(f, exc_info): |
44 def future_set_exception_info(f, exc_info): |
45 f.set_exception(exc_info[0]) |
45 f.set_exception(exc_info[0]) |
46 |
46 |
47 def identity(a): |
47 def identity(a): |
48 return a |
48 return a |
|
49 |
|
50 def _rapply(f, xs): |
|
51 if xs is None: |
|
52 # assume None means non-value of optional data |
|
53 return xs |
|
54 if isinstance(xs, (list, set, tuple)): |
|
55 return type(xs)(_rapply(f, x) for x in xs) |
|
56 if isinstance(xs, dict): |
|
57 return type(xs)((_rapply(f, k), _rapply(f, v)) for k, v in xs.items()) |
|
58 return f(xs) |
|
59 |
|
60 def rapply(f, xs): |
|
61 """Apply function recursively to every item preserving the data structure |
|
62 |
|
63 >>> def f(x): |
|
64 ... return 'f(%s)' % x |
|
65 >>> rapply(f, None) is None |
|
66 True |
|
67 >>> rapply(f, 'a') |
|
68 'f(a)' |
|
69 >>> rapply(f, {'a'}) == {'f(a)'} |
|
70 True |
|
71 >>> rapply(f, ['a', 'b', None, {'c': 'd'}, []]) |
|
72 ['f(a)', 'f(b)', None, {'f(c)': 'f(d)'}, []] |
|
73 |
|
74 >>> xs = [object()] |
|
75 >>> rapply(identity, xs) is xs |
|
76 True |
|
77 """ |
|
78 if f is identity: |
|
79 # fast path mainly for py2 |
|
80 return xs |
|
81 return _rapply(f, xs) |
49 |
82 |
50 if ispy3: |
83 if ispy3: |
51 import builtins |
84 import builtins |
52 import functools |
85 import functools |
53 import io |
86 import io |