Software /
code /
prosody
Annotate
util/iterators.lua @ 8791:8da11142fabf
muc: Allow clients to change multiple affiliations or roles at once (#345)
According to XEP-0045 sections 9.2, 9.5 and 9.8 affiliation lists and role
lists should allow mass-modification. Prosody however would just use the
first entry of the list and ignore the rest. This is fixed by introducing
a `for` loop to `set` stanzas of the respective `muc#admin` namespace.
In order for this loop to work, the error handling was changed a little.
Prosody no longer returns after the first error. Instead, an error reply
is sent for each malformed or otherwise wrong entry, but the loop keeps
going over the other entries. This may lead to multiple error messages
being sent for one client request. A notable exception from this is when
the XML Schema for `muc#admin` requests is violated. In that case the loop
is aborted with an error message to the client.
The change is a bit bigger than that in order to have the loop only for
`set` stanzas without changing the behaviour of the `get` stanzas. This is
now more in line with trunk, where there are separate methods for each
stanza type.
References: #345
author | Lennart Sauerbeck <devel@lennart.sauerbeck.org> |
---|---|
date | Sat, 18 Mar 2017 18:47:28 +0100 |
parent | 7355:4b4cf0167391 |
child | 8389:5d866eb8f18f |
rev | line source |
---|---|
1522
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
919
diff
changeset
|
1 -- Prosody IM |
2923
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
1660
diff
changeset
|
2 -- Copyright (C) 2008-2010 Matthew Wild |
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
1660
diff
changeset
|
3 -- Copyright (C) 2008-2010 Waqas Hussain |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5583
diff
changeset
|
4 -- |
1522
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
919
diff
changeset
|
5 -- This project is MIT/X11 licensed. Please see the |
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
919
diff
changeset
|
6 -- COPYING file in the source package for more information. |
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
919
diff
changeset
|
7 -- |
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
919
diff
changeset
|
8 |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 --[[ Iterators ]]-- |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 |
4545
c9b91ddc9c11
util.iterators: Make a standard library (no longer injects into global namespace)
Matthew Wild <mwild1@gmail.com>
parents:
4441
diff
changeset
|
11 local it = {}; |
c9b91ddc9c11
util.iterators: Make a standard library (no longer injects into global namespace)
Matthew Wild <mwild1@gmail.com>
parents:
4441
diff
changeset
|
12 |
5581
167c1da54606
util.iterators: Various fixes and improvements, primarily use pack() where it should be used.
Matthew Wild <mwild1@gmail.com>
parents:
5468
diff
changeset
|
13 local t_insert = table.insert; |
7184
dedc6bf180e2
util.iterators: Localize unpack() in Lua 5.2 compatible way
Kim Alvefur <zash@zash.se>
parents:
5776
diff
changeset
|
14 local select, next = select, next; |
dedc6bf180e2
util.iterators: Localize unpack() in Lua 5.2 compatible way
Kim Alvefur <zash@zash.se>
parents:
5776
diff
changeset
|
15 local unpack = table.unpack or unpack; --luacheck: ignore 113 |
7186
9c3930bcbb72
util.iterators: Use table.pack() on Lua 5.2
Kim Alvefur <zash@zash.se>
parents:
7184
diff
changeset
|
16 local pack = table.pack or function (...) return { n = select("#", ...), ... }; end |
5581
167c1da54606
util.iterators: Various fixes and improvements, primarily use pack() where it should be used.
Matthew Wild <mwild1@gmail.com>
parents:
5468
diff
changeset
|
17 |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 -- Reverse an iterator |
4545
c9b91ddc9c11
util.iterators: Make a standard library (no longer injects into global namespace)
Matthew Wild <mwild1@gmail.com>
parents:
4441
diff
changeset
|
19 function it.reverse(f, s, var) |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
20 local results = {}; |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
22 -- First call the normal iterator |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
23 while true do |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 local ret = { f(s, var) }; |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 var = ret[1]; |
7351
11434c46b7b7
util.iterators: Normalize indentation
Kim Alvefur <zash@zash.se>
parents:
7309
diff
changeset
|
26 if var == nil then break; end |
5581
167c1da54606
util.iterators: Various fixes and improvements, primarily use pack() where it should be used.
Matthew Wild <mwild1@gmail.com>
parents:
5468
diff
changeset
|
27 t_insert(results, 1, ret); |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
28 end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5583
diff
changeset
|
29 |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 -- Then return our reverse one |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 local i,max = 0, #results; |
7260
a9ef93bc81d9
util.iterators: Variable renaming to avoid shadowing [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
7258
diff
changeset
|
32 return function (_results) |
7351
11434c46b7b7
util.iterators: Normalize indentation
Kim Alvefur <zash@zash.se>
parents:
7309
diff
changeset
|
33 if i<max then |
11434c46b7b7
util.iterators: Normalize indentation
Kim Alvefur <zash@zash.se>
parents:
7309
diff
changeset
|
34 i = i + 1; |
11434c46b7b7
util.iterators: Normalize indentation
Kim Alvefur <zash@zash.se>
parents:
7309
diff
changeset
|
35 return unpack(_results[i]); |
11434c46b7b7
util.iterators: Normalize indentation
Kim Alvefur <zash@zash.se>
parents:
7309
diff
changeset
|
36 end |
11434c46b7b7
util.iterators: Normalize indentation
Kim Alvefur <zash@zash.se>
parents:
7309
diff
changeset
|
37 end, results; |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 end |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
39 |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
40 -- Iterate only over keys in a table |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
41 local function _keys_it(t, key) |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
42 return (next(t, key)); |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 end |
4545
c9b91ddc9c11
util.iterators: Make a standard library (no longer injects into global namespace)
Matthew Wild <mwild1@gmail.com>
parents:
4441
diff
changeset
|
44 function it.keys(t) |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
45 return _keys_it, t; |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
46 end |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
47 |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 -- Iterate only over values in a table |
4545
c9b91ddc9c11
util.iterators: Make a standard library (no longer injects into global namespace)
Matthew Wild <mwild1@gmail.com>
parents:
4441
diff
changeset
|
49 function it.values(t) |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
50 local key, val; |
7260
a9ef93bc81d9
util.iterators: Variable renaming to avoid shadowing [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
7258
diff
changeset
|
51 return function (_t) |
a9ef93bc81d9
util.iterators: Variable renaming to avoid shadowing [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
7258
diff
changeset
|
52 key, val = next(_t, key); |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
53 return val; |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
54 end, t; |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
55 end |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
56 |
7355
4b4cf0167391
util.iterators: Add iterator wrapper that works like select(n, ...) applied to original iterator
Kim Alvefur <zash@zash.se>
parents:
7351
diff
changeset
|
57 -- Iterate over the n:th return value |
4b4cf0167391
util.iterators: Add iterator wrapper that works like select(n, ...) applied to original iterator
Kim Alvefur <zash@zash.se>
parents:
7351
diff
changeset
|
58 function it.select(n, f, s, var) |
4b4cf0167391
util.iterators: Add iterator wrapper that works like select(n, ...) applied to original iterator
Kim Alvefur <zash@zash.se>
parents:
7351
diff
changeset
|
59 return function (_s) |
4b4cf0167391
util.iterators: Add iterator wrapper that works like select(n, ...) applied to original iterator
Kim Alvefur <zash@zash.se>
parents:
7351
diff
changeset
|
60 local ret = pack(f(_s, var)); |
4b4cf0167391
util.iterators: Add iterator wrapper that works like select(n, ...) applied to original iterator
Kim Alvefur <zash@zash.se>
parents:
7351
diff
changeset
|
61 var = ret[1]; |
4b4cf0167391
util.iterators: Add iterator wrapper that works like select(n, ...) applied to original iterator
Kim Alvefur <zash@zash.se>
parents:
7351
diff
changeset
|
62 return ret[n]; |
4b4cf0167391
util.iterators: Add iterator wrapper that works like select(n, ...) applied to original iterator
Kim Alvefur <zash@zash.se>
parents:
7351
diff
changeset
|
63 end, s, var; |
4b4cf0167391
util.iterators: Add iterator wrapper that works like select(n, ...) applied to original iterator
Kim Alvefur <zash@zash.se>
parents:
7351
diff
changeset
|
64 end |
4b4cf0167391
util.iterators: Add iterator wrapper that works like select(n, ...) applied to original iterator
Kim Alvefur <zash@zash.se>
parents:
7351
diff
changeset
|
65 |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 -- Given an iterator, iterate only over unique items |
4545
c9b91ddc9c11
util.iterators: Make a standard library (no longer injects into global namespace)
Matthew Wild <mwild1@gmail.com>
parents:
4441
diff
changeset
|
67 function it.unique(f, s, var) |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
68 local set = {}; |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5583
diff
changeset
|
69 |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
70 return function () |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 while true do |
5581
167c1da54606
util.iterators: Various fixes and improvements, primarily use pack() where it should be used.
Matthew Wild <mwild1@gmail.com>
parents:
5468
diff
changeset
|
72 local ret = pack(f(s, var)); |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
73 var = ret[1]; |
7351
11434c46b7b7
util.iterators: Normalize indentation
Kim Alvefur <zash@zash.se>
parents:
7309
diff
changeset
|
74 if var == nil then break; end |
11434c46b7b7
util.iterators: Normalize indentation
Kim Alvefur <zash@zash.se>
parents:
7309
diff
changeset
|
75 if not set[var] then |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
76 set[var] = true; |
5581
167c1da54606
util.iterators: Various fixes and improvements, primarily use pack() where it should be used.
Matthew Wild <mwild1@gmail.com>
parents:
5468
diff
changeset
|
77 return unpack(ret, 1, ret.n); |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
78 end |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
79 end |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
80 end; |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
81 end |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
82 |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
83 --[[ Return the number of items an iterator returns ]]-- |
4545
c9b91ddc9c11
util.iterators: Make a standard library (no longer injects into global namespace)
Matthew Wild <mwild1@gmail.com>
parents:
4441
diff
changeset
|
84 function it.count(f, s, var) |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
85 local x = 0; |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5583
diff
changeset
|
86 |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
87 while true do |
5583
78dbece77ce8
util.iterators: Small fix for variable scoping issue
Matthew Wild <mwild1@gmail.com>
parents:
5582
diff
changeset
|
88 var = f(s, var); |
7351
11434c46b7b7
util.iterators: Normalize indentation
Kim Alvefur <zash@zash.se>
parents:
7309
diff
changeset
|
89 if var == nil then break; end |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
90 x = x + 1; |
3540
bc139431830b
Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents:
3392
diff
changeset
|
91 end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5583
diff
changeset
|
92 |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
93 return x; |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
94 end |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
95 |
1659
6092fc9b078b
util.iterators: Add head() iterator, to return the first n items
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
96 -- Return the first n items an iterator returns |
4545
c9b91ddc9c11
util.iterators: Make a standard library (no longer injects into global namespace)
Matthew Wild <mwild1@gmail.com>
parents:
4441
diff
changeset
|
97 function it.head(n, f, s, var) |
1659
6092fc9b078b
util.iterators: Add head() iterator, to return the first n items
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
98 local c = 0; |
7260
a9ef93bc81d9
util.iterators: Variable renaming to avoid shadowing [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
7258
diff
changeset
|
99 return function (_s, _var) |
1659
6092fc9b078b
util.iterators: Add head() iterator, to return the first n items
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
100 if c >= n then |
6092fc9b078b
util.iterators: Add head() iterator, to return the first n items
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
101 return nil; |
6092fc9b078b
util.iterators: Add head() iterator, to return the first n items
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
102 end |
6092fc9b078b
util.iterators: Add head() iterator, to return the first n items
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
103 c = c + 1; |
7260
a9ef93bc81d9
util.iterators: Variable renaming to avoid shadowing [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
7258
diff
changeset
|
104 return f(_s, _var); |
7258
b8f60dd8e99a
util.iterators: Return initial var from upstream iterator [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
7257
diff
changeset
|
105 end, s, var; |
1659
6092fc9b078b
util.iterators: Add head() iterator, to return the first n items
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
106 end |
6092fc9b078b
util.iterators: Add head() iterator, to return the first n items
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
107 |
3392
6e31b49c4ab8
util.iterators: Add skip() to skip the first n items of an iterator
Matthew Wild <mwild1@gmail.com>
parents:
2923
diff
changeset
|
108 -- Skip the first n items an iterator returns |
4545
c9b91ddc9c11
util.iterators: Make a standard library (no longer injects into global namespace)
Matthew Wild <mwild1@gmail.com>
parents:
4441
diff
changeset
|
109 function it.skip(n, f, s, var) |
7260
a9ef93bc81d9
util.iterators: Variable renaming to avoid shadowing [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
7258
diff
changeset
|
110 for _ = 1, n do |
3392
6e31b49c4ab8
util.iterators: Add skip() to skip the first n items of an iterator
Matthew Wild <mwild1@gmail.com>
parents:
2923
diff
changeset
|
111 var = f(s, var); |
6e31b49c4ab8
util.iterators: Add skip() to skip the first n items of an iterator
Matthew Wild <mwild1@gmail.com>
parents:
2923
diff
changeset
|
112 end |
6e31b49c4ab8
util.iterators: Add skip() to skip the first n items of an iterator
Matthew Wild <mwild1@gmail.com>
parents:
2923
diff
changeset
|
113 return f, s, var; |
6e31b49c4ab8
util.iterators: Add skip() to skip the first n items of an iterator
Matthew Wild <mwild1@gmail.com>
parents:
2923
diff
changeset
|
114 end |
6e31b49c4ab8
util.iterators: Add skip() to skip the first n items of an iterator
Matthew Wild <mwild1@gmail.com>
parents:
2923
diff
changeset
|
115 |
6e31b49c4ab8
util.iterators: Add skip() to skip the first n items of an iterator
Matthew Wild <mwild1@gmail.com>
parents:
2923
diff
changeset
|
116 -- Return the last n items an iterator returns |
4545
c9b91ddc9c11
util.iterators: Make a standard library (no longer injects into global namespace)
Matthew Wild <mwild1@gmail.com>
parents:
4441
diff
changeset
|
117 function it.tail(n, f, s, var) |
1660
ae2f60a20428
util.iterators: Add tail() iterator, to return the last n items
Matthew Wild <mwild1@gmail.com>
parents:
1659
diff
changeset
|
118 local results, count = {}, 0; |
ae2f60a20428
util.iterators: Add tail() iterator, to return the last n items
Matthew Wild <mwild1@gmail.com>
parents:
1659
diff
changeset
|
119 while true do |
5581
167c1da54606
util.iterators: Various fixes and improvements, primarily use pack() where it should be used.
Matthew Wild <mwild1@gmail.com>
parents:
5468
diff
changeset
|
120 local ret = pack(f(s, var)); |
1660
ae2f60a20428
util.iterators: Add tail() iterator, to return the last n items
Matthew Wild <mwild1@gmail.com>
parents:
1659
diff
changeset
|
121 var = ret[1]; |
7351
11434c46b7b7
util.iterators: Normalize indentation
Kim Alvefur <zash@zash.se>
parents:
7309
diff
changeset
|
122 if var == nil then break; end |
1660
ae2f60a20428
util.iterators: Add tail() iterator, to return the last n items
Matthew Wild <mwild1@gmail.com>
parents:
1659
diff
changeset
|
123 results[(count%n)+1] = ret; |
ae2f60a20428
util.iterators: Add tail() iterator, to return the last n items
Matthew Wild <mwild1@gmail.com>
parents:
1659
diff
changeset
|
124 count = count + 1; |
ae2f60a20428
util.iterators: Add tail() iterator, to return the last n items
Matthew Wild <mwild1@gmail.com>
parents:
1659
diff
changeset
|
125 end |
ae2f60a20428
util.iterators: Add tail() iterator, to return the last n items
Matthew Wild <mwild1@gmail.com>
parents:
1659
diff
changeset
|
126 |
ae2f60a20428
util.iterators: Add tail() iterator, to return the last n items
Matthew Wild <mwild1@gmail.com>
parents:
1659
diff
changeset
|
127 if n > count then n = count; end |
ae2f60a20428
util.iterators: Add tail() iterator, to return the last n items
Matthew Wild <mwild1@gmail.com>
parents:
1659
diff
changeset
|
128 |
ae2f60a20428
util.iterators: Add tail() iterator, to return the last n items
Matthew Wild <mwild1@gmail.com>
parents:
1659
diff
changeset
|
129 local pos = 0; |
ae2f60a20428
util.iterators: Add tail() iterator, to return the last n items
Matthew Wild <mwild1@gmail.com>
parents:
1659
diff
changeset
|
130 return function () |
ae2f60a20428
util.iterators: Add tail() iterator, to return the last n items
Matthew Wild <mwild1@gmail.com>
parents:
1659
diff
changeset
|
131 pos = pos + 1; |
ae2f60a20428
util.iterators: Add tail() iterator, to return the last n items
Matthew Wild <mwild1@gmail.com>
parents:
1659
diff
changeset
|
132 if pos > n then return nil; end |
5581
167c1da54606
util.iterators: Various fixes and improvements, primarily use pack() where it should be used.
Matthew Wild <mwild1@gmail.com>
parents:
5468
diff
changeset
|
133 local ret = results[((count-1+pos)%n)+1]; |
167c1da54606
util.iterators: Various fixes and improvements, primarily use pack() where it should be used.
Matthew Wild <mwild1@gmail.com>
parents:
5468
diff
changeset
|
134 return unpack(ret, 1, ret.n); |
1660
ae2f60a20428
util.iterators: Add tail() iterator, to return the last n items
Matthew Wild <mwild1@gmail.com>
parents:
1659
diff
changeset
|
135 end |
5582
7bc2009fdd0c
util.iterators: Add filter() to run results through a filter function
Matthew Wild <mwild1@gmail.com>
parents:
5581
diff
changeset
|
136 --return reverse(head(n, reverse(f, s, var))); -- ! |
7bc2009fdd0c
util.iterators: Add filter() to run results through a filter function
Matthew Wild <mwild1@gmail.com>
parents:
5581
diff
changeset
|
137 end |
7bc2009fdd0c
util.iterators: Add filter() to run results through a filter function
Matthew Wild <mwild1@gmail.com>
parents:
5581
diff
changeset
|
138 |
7bc2009fdd0c
util.iterators: Add filter() to run results through a filter function
Matthew Wild <mwild1@gmail.com>
parents:
5581
diff
changeset
|
139 function it.filter(filter, f, s, var) |
7bc2009fdd0c
util.iterators: Add filter() to run results through a filter function
Matthew Wild <mwild1@gmail.com>
parents:
5581
diff
changeset
|
140 if type(filter) ~= "function" then |
7bc2009fdd0c
util.iterators: Add filter() to run results through a filter function
Matthew Wild <mwild1@gmail.com>
parents:
5581
diff
changeset
|
141 local filter_value = filter; |
7bc2009fdd0c
util.iterators: Add filter() to run results through a filter function
Matthew Wild <mwild1@gmail.com>
parents:
5581
diff
changeset
|
142 function filter(x) return x ~= filter_value; end |
7bc2009fdd0c
util.iterators: Add filter() to run results through a filter function
Matthew Wild <mwild1@gmail.com>
parents:
5581
diff
changeset
|
143 end |
7260
a9ef93bc81d9
util.iterators: Variable renaming to avoid shadowing [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
7258
diff
changeset
|
144 return function (_s, _var) |
5582
7bc2009fdd0c
util.iterators: Add filter() to run results through a filter function
Matthew Wild <mwild1@gmail.com>
parents:
5581
diff
changeset
|
145 local ret; |
7260
a9ef93bc81d9
util.iterators: Variable renaming to avoid shadowing [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
7258
diff
changeset
|
146 repeat ret = pack(f(_s, _var)); |
7309
471189342890
util.iterators: Fix use of incorrect variable accidentally introduced in a9ef93bc81d9
Matthew Wild <mwild1@gmail.com>
parents:
7260
diff
changeset
|
147 _var = ret[1]; |
471189342890
util.iterators: Fix use of incorrect variable accidentally introduced in a9ef93bc81d9
Matthew Wild <mwild1@gmail.com>
parents:
7260
diff
changeset
|
148 until _var == nil or filter(unpack(ret, 1, ret.n)); |
5582
7bc2009fdd0c
util.iterators: Add filter() to run results through a filter function
Matthew Wild <mwild1@gmail.com>
parents:
5581
diff
changeset
|
149 return unpack(ret, 1, ret.n); |
7bc2009fdd0c
util.iterators: Add filter() to run results through a filter function
Matthew Wild <mwild1@gmail.com>
parents:
5581
diff
changeset
|
150 end, s, var; |
1660
ae2f60a20428
util.iterators: Add tail() iterator, to return the last n items
Matthew Wild <mwild1@gmail.com>
parents:
1659
diff
changeset
|
151 end |
ae2f60a20428
util.iterators: Add tail() iterator, to return the last n items
Matthew Wild <mwild1@gmail.com>
parents:
1659
diff
changeset
|
152 |
5468
2660407c3b73
util.iterators: Add ripairs() (ipairs() in reverse) (thanks Maranda)
Matthew Wild <mwild1@gmail.com>
parents:
4545
diff
changeset
|
153 local function _ripairs_iter(t, key) if key > 1 then return key-1, t[key-1]; end end |
2660407c3b73
util.iterators: Add ripairs() (ipairs() in reverse) (thanks Maranda)
Matthew Wild <mwild1@gmail.com>
parents:
4545
diff
changeset
|
154 function it.ripairs(t) |
2660407c3b73
util.iterators: Add ripairs() (ipairs() in reverse) (thanks Maranda)
Matthew Wild <mwild1@gmail.com>
parents:
4545
diff
changeset
|
155 return _ripairs_iter, t, #t+1; |
2660407c3b73
util.iterators: Add ripairs() (ipairs() in reverse) (thanks Maranda)
Matthew Wild <mwild1@gmail.com>
parents:
4545
diff
changeset
|
156 end |
2660407c3b73
util.iterators: Add ripairs() (ipairs() in reverse) (thanks Maranda)
Matthew Wild <mwild1@gmail.com>
parents:
4545
diff
changeset
|
157 |
4386
ce769240f8ec
util.iterators: Add range(from, to)
Matthew Wild <mwild1@gmail.com>
parents:
3540
diff
changeset
|
158 local function _range_iter(max, curr) if curr < max then return curr + 1; end end |
4545
c9b91ddc9c11
util.iterators: Make a standard library (no longer injects into global namespace)
Matthew Wild <mwild1@gmail.com>
parents:
4441
diff
changeset
|
159 function it.range(x, y) |
4386
ce769240f8ec
util.iterators: Add range(from, to)
Matthew Wild <mwild1@gmail.com>
parents:
3540
diff
changeset
|
160 if not y then x, y = 1, x; end -- Default to 1..x if y not given |
ce769240f8ec
util.iterators: Add range(from, to)
Matthew Wild <mwild1@gmail.com>
parents:
3540
diff
changeset
|
161 return _range_iter, y, x-1; |
ce769240f8ec
util.iterators: Add range(from, to)
Matthew Wild <mwild1@gmail.com>
parents:
3540
diff
changeset
|
162 end |
ce769240f8ec
util.iterators: Add range(from, to)
Matthew Wild <mwild1@gmail.com>
parents:
3540
diff
changeset
|
163 |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
164 -- Convert the values returned by an iterator to an array |
4545
c9b91ddc9c11
util.iterators: Make a standard library (no longer injects into global namespace)
Matthew Wild <mwild1@gmail.com>
parents:
4441
diff
changeset
|
165 function it.to_array(f, s, var) |
7257
425bc672d60b
util.iterators: Don't replace var, as we should preserve var from the original iterator [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
7186
diff
changeset
|
166 local t = {}; |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
167 while true do |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
168 var = f(s, var); |
7351
11434c46b7b7
util.iterators: Normalize indentation
Kim Alvefur <zash@zash.se>
parents:
7309
diff
changeset
|
169 if var == nil then break; end |
5581
167c1da54606
util.iterators: Various fixes and improvements, primarily use pack() where it should be used.
Matthew Wild <mwild1@gmail.com>
parents:
5468
diff
changeset
|
170 t_insert(t, var); |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
171 end |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
172 return t; |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
173 end |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
174 |
3540
bc139431830b
Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents:
3392
diff
changeset
|
175 -- Treat the return of an iterator as key,value pairs, |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
176 -- and build a table |
4545
c9b91ddc9c11
util.iterators: Make a standard library (no longer injects into global namespace)
Matthew Wild <mwild1@gmail.com>
parents:
4441
diff
changeset
|
177 function it.to_table(f, s, var) |
4441
a01b7207cb37
util.iterators: it2table: Fix variable name
Matthew Wild <mwild1@gmail.com>
parents:
4386
diff
changeset
|
178 local t, var2 = {}; |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
179 while true do |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
180 var, var2 = f(s, var); |
7351
11434c46b7b7
util.iterators: Normalize indentation
Kim Alvefur <zash@zash.se>
parents:
7309
diff
changeset
|
181 if var == nil then break; end |
919
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
182 t[var] = var2; |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
183 end |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
184 return t; |
75b8afb79143
util.iterators: New iterators library
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
185 end |
4386
ce769240f8ec
util.iterators: Add range(from, to)
Matthew Wild <mwild1@gmail.com>
parents:
3540
diff
changeset
|
186 |
4545
c9b91ddc9c11
util.iterators: Make a standard library (no longer injects into global namespace)
Matthew Wild <mwild1@gmail.com>
parents:
4441
diff
changeset
|
187 return it; |