Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/python-wasm
Path: blob/main/python/pylang/src/baselib/itertools.py
1398 views
1
# vim:fileencoding=utf-8
2
# License: BSD
3
# Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>
4
5
# globals: ρσ_iterator_symbol, ρσ_bool
6
7
def sum(iterable, start=0):
8
if Array.isArray(iterable):
9
def add(prev, cur):
10
return prev + cur
11
return iterable.reduce(add, start)
12
ans = start
13
iterator = iter(iterable)
14
r = iterator.next()
15
while not r.done:
16
ans += r.value
17
r = iterator.next()
18
return ans
19
20
def map():
21
iterators = new Array(arguments.length - 1)
22
func = arguments[0] # noqa: unused-local
23
args = new Array(arguments.length - 1) # noqa: unused-local
24
for v'var i = 1; i < arguments.length; i++':
25
iterators[i - 1] = iter(arguments[i]) # noqa:undef
26
ans = v"{'_func':func, '_iterators':iterators, '_args':args}"
27
ans[ρσ_iterator_symbol] = def():
28
return this
29
ans['next'] = def():
30
for v'var i = 0; i < this._iterators.length; i++':
31
r = this._iterators[i].next()
32
if r.done:
33
return v"{'done':true}"
34
this._args[i] = r.value # noqa:undef
35
return v"{'done':false, 'value':this._func.apply(undefined, this._args)}"
36
return ans
37
38
def filter(func_or_none, iterable):
39
func = ρσ_bool if func_or_none is None else func_or_none # noqa: unused-local
40
ans = v"{'_func':func, '_iterator':ρσ_iter(iterable)}"
41
ans[ρσ_iterator_symbol] = def():
42
return this
43
ans['next'] = def():
44
r = this._iterator.next()
45
while not r.done:
46
if this._func(r.value):
47
return r
48
r = this._iterator.next()
49
return v"{'done':true}"
50
return ans
51
52
def zip():
53
iterators = new Array(arguments.length)
54
for v'var i = 0; i < arguments.length; i++':
55
iterators[i] = iter(arguments[i]) # noqa:undef
56
ans = v"{'_iterators':iterators}"
57
ans[ρσ_iterator_symbol] = def():
58
return this
59
ans['next'] = def():
60
args = new Array(this._iterators.length)
61
for v'var i = 0; i < this._iterators.length; i++':
62
r = this._iterators[i].next()
63
if r.done:
64
return v"{'done':true}"
65
args[i] = r.value # noqa:undef
66
return v"{'done':false, 'value':args}"
67
return ans
68
69
def any(iterable):
70
for i in iterable:
71
if i:
72
return True
73
return False
74
75
def all(iterable):
76
for i in iterable:
77
if not i:
78
return False
79
return True
80
81