comparison mercurial/util.py @ 35900:72de5c504833

py3: factor out helpers to apply string conversion recursively
author Yuya Nishihara <yuya@tcha.org>
date Sat, 27 Jan 2018 13:33:31 +0900
parents 2384523cee4d
children 15c8c4ac5d9c
comparison
equal deleted inserted replaced
35899:d5457d94e1c9 35900:72de5c504833
180 # libraries, and sure enough Mercurial is not a library.) 180 # libraries, and sure enough Mercurial is not a library.)
181 os.stat_float_times(False) 181 os.stat_float_times(False)
182 182
183 def safehasattr(thing, attr): 183 def safehasattr(thing, attr):
184 return getattr(thing, attr, _notset) is not _notset 184 return getattr(thing, attr, _notset) is not _notset
185
186 def _rapply(f, xs):
187 if xs is None:
188 # assume None means non-value of optional data
189 return xs
190 if isinstance(xs, (list, set, tuple)):
191 return type(xs)(_rapply(f, x) for x in xs)
192 if isinstance(xs, dict):
193 return type(xs)((_rapply(f, k), _rapply(f, v)) for k, v in xs.items())
194 return f(xs)
195
196 def rapply(f, xs):
197 """Apply function recursively to every item preserving the data structure
198
199 >>> def f(x):
200 ... return 'f(%s)' % x
201 >>> rapply(f, None) is None
202 True
203 >>> rapply(f, 'a')
204 'f(a)'
205 >>> rapply(f, {'a'}) == {'f(a)'}
206 True
207 >>> rapply(f, ['a', 'b', None, {'c': 'd'}, []])
208 ['f(a)', 'f(b)', None, {'f(c)': 'f(d)'}, []]
209
210 >>> xs = [object()]
211 >>> rapply(pycompat.identity, xs) is xs
212 True
213 """
214 if f is pycompat.identity:
215 # fast path mainly for py2
216 return xs
217 return _rapply(f, xs)
185 218
186 def bytesinput(fin, fout, *args, **kwargs): 219 def bytesinput(fin, fout, *args, **kwargs):
187 sin, sout = sys.stdin, sys.stdout 220 sin, sout = sys.stdin, sys.stdout
188 try: 221 try:
189 sys.stdin, sys.stdout = encoding.strio(fin), encoding.strio(fout) 222 sys.stdin, sys.stdout = encoding.strio(fin), encoding.strio(fout)