Path: blob/main/python/pylang/src/baselib/itertools.py
1398 views
# vim:fileencoding=utf-81# License: BSD2# Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>34# globals: ρσ_iterator_symbol, ρσ_bool56def sum(iterable, start=0):7if Array.isArray(iterable):8def add(prev, cur):9return prev + cur10return iterable.reduce(add, start)11ans = start12iterator = iter(iterable)13r = iterator.next()14while not r.done:15ans += r.value16r = iterator.next()17return ans1819def map():20iterators = new Array(arguments.length - 1)21func = arguments[0] # noqa: unused-local22args = new Array(arguments.length - 1) # noqa: unused-local23for v'var i = 1; i < arguments.length; i++':24iterators[i - 1] = iter(arguments[i]) # noqa:undef25ans = v"{'_func':func, '_iterators':iterators, '_args':args}"26ans[ρσ_iterator_symbol] = def():27return this28ans['next'] = def():29for v'var i = 0; i < this._iterators.length; i++':30r = this._iterators[i].next()31if r.done:32return v"{'done':true}"33this._args[i] = r.value # noqa:undef34return v"{'done':false, 'value':this._func.apply(undefined, this._args)}"35return ans3637def filter(func_or_none, iterable):38func = ρσ_bool if func_or_none is None else func_or_none # noqa: unused-local39ans = v"{'_func':func, '_iterator':ρσ_iter(iterable)}"40ans[ρσ_iterator_symbol] = def():41return this42ans['next'] = def():43r = this._iterator.next()44while not r.done:45if this._func(r.value):46return r47r = this._iterator.next()48return v"{'done':true}"49return ans5051def zip():52iterators = new Array(arguments.length)53for v'var i = 0; i < arguments.length; i++':54iterators[i] = iter(arguments[i]) # noqa:undef55ans = v"{'_iterators':iterators}"56ans[ρσ_iterator_symbol] = def():57return this58ans['next'] = def():59args = new Array(this._iterators.length)60for v'var i = 0; i < this._iterators.length; i++':61r = this._iterators[i].next()62if r.done:63return v"{'done':true}"64args[i] = r.value # noqa:undef65return v"{'done':false, 'value':args}"66return ans6768def any(iterable):69for i in iterable:70if i:71return True72return False7374def all(iterable):75for i in iterable:76if not i:77return False78return True798081