Mercurial > prosody-hg
comparison util/iterators.lua @ 4797:e239668aa6d2
Merge 0.9->trunk
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Sun, 29 Apr 2012 02:10:55 +0100 |
| parents | c9b91ddc9c11 |
| children | 2660407c3b73 |
comparison
equal
deleted
inserted
replaced
| 4796:04a34287dc12 | 4797:e239668aa6d2 |
|---|---|
| 6 -- COPYING file in the source package for more information. | 6 -- COPYING file in the source package for more information. |
| 7 -- | 7 -- |
| 8 | 8 |
| 9 --[[ Iterators ]]-- | 9 --[[ Iterators ]]-- |
| 10 | 10 |
| 11 local it = {}; | |
| 12 | |
| 11 -- Reverse an iterator | 13 -- Reverse an iterator |
| 12 function reverse(f, s, var) | 14 function it.reverse(f, s, var) |
| 13 local results = {}; | 15 local results = {}; |
| 14 | 16 |
| 15 -- First call the normal iterator | 17 -- First call the normal iterator |
| 16 while true do | 18 while true do |
| 17 local ret = { f(s, var) }; | 19 local ret = { f(s, var) }; |
| 32 | 34 |
| 33 -- Iterate only over keys in a table | 35 -- Iterate only over keys in a table |
| 34 local function _keys_it(t, key) | 36 local function _keys_it(t, key) |
| 35 return (next(t, key)); | 37 return (next(t, key)); |
| 36 end | 38 end |
| 37 function keys(t) | 39 function it.keys(t) |
| 38 return _keys_it, t; | 40 return _keys_it, t; |
| 39 end | 41 end |
| 40 | 42 |
| 41 -- Iterate only over values in a table | 43 -- Iterate only over values in a table |
| 42 function values(t) | 44 function it.values(t) |
| 43 local key, val; | 45 local key, val; |
| 44 return function (t) | 46 return function (t) |
| 45 key, val = next(t, key); | 47 key, val = next(t, key); |
| 46 return val; | 48 return val; |
| 47 end, t; | 49 end, t; |
| 48 end | 50 end |
| 49 | 51 |
| 50 -- Given an iterator, iterate only over unique items | 52 -- Given an iterator, iterate only over unique items |
| 51 function unique(f, s, var) | 53 function it.unique(f, s, var) |
| 52 local set = {}; | 54 local set = {}; |
| 53 | 55 |
| 54 return function () | 56 return function () |
| 55 while true do | 57 while true do |
| 56 local ret = { f(s, var) }; | 58 local ret = { f(s, var) }; |
| 63 end | 65 end |
| 64 end; | 66 end; |
| 65 end | 67 end |
| 66 | 68 |
| 67 --[[ Return the number of items an iterator returns ]]-- | 69 --[[ Return the number of items an iterator returns ]]-- |
| 68 function count(f, s, var) | 70 function it.count(f, s, var) |
| 69 local x = 0; | 71 local x = 0; |
| 70 | 72 |
| 71 while true do | 73 while true do |
| 72 local ret = { f(s, var) }; | 74 local ret = { f(s, var) }; |
| 73 var = ret[1]; | 75 var = ret[1]; |
| 77 | 79 |
| 78 return x; | 80 return x; |
| 79 end | 81 end |
| 80 | 82 |
| 81 -- Return the first n items an iterator returns | 83 -- Return the first n items an iterator returns |
| 82 function head(n, f, s, var) | 84 function it.head(n, f, s, var) |
| 83 local c = 0; | 85 local c = 0; |
| 84 return function (s, var) | 86 return function (s, var) |
| 85 if c >= n then | 87 if c >= n then |
| 86 return nil; | 88 return nil; |
| 87 end | 89 end |
| 89 return f(s, var); | 91 return f(s, var); |
| 90 end, s; | 92 end, s; |
| 91 end | 93 end |
| 92 | 94 |
| 93 -- Skip the first n items an iterator returns | 95 -- Skip the first n items an iterator returns |
| 94 function skip(n, f, s, var) | 96 function it.skip(n, f, s, var) |
| 95 for i=1,n do | 97 for i=1,n do |
| 96 var = f(s, var); | 98 var = f(s, var); |
| 97 end | 99 end |
| 98 return f, s, var; | 100 return f, s, var; |
| 99 end | 101 end |
| 100 | 102 |
| 101 -- Return the last n items an iterator returns | 103 -- Return the last n items an iterator returns |
| 102 function tail(n, f, s, var) | 104 function it.tail(n, f, s, var) |
| 103 local results, count = {}, 0; | 105 local results, count = {}, 0; |
| 104 while true do | 106 while true do |
| 105 local ret = { f(s, var) }; | 107 local ret = { f(s, var) }; |
| 106 var = ret[1]; | 108 var = ret[1]; |
| 107 if var == nil then break; end | 109 if var == nil then break; end |
| 119 end | 121 end |
| 120 --return reverse(head(n, reverse(f, s, var))); | 122 --return reverse(head(n, reverse(f, s, var))); |
| 121 end | 123 end |
| 122 | 124 |
| 123 local function _range_iter(max, curr) if curr < max then return curr + 1; end end | 125 local function _range_iter(max, curr) if curr < max then return curr + 1; end end |
| 124 function range(x, y) | 126 function it.range(x, y) |
| 125 if not y then x, y = 1, x; end -- Default to 1..x if y not given | 127 if not y then x, y = 1, x; end -- Default to 1..x if y not given |
| 126 return _range_iter, y, x-1; | 128 return _range_iter, y, x-1; |
| 127 end | 129 end |
| 128 | 130 |
| 129 -- Convert the values returned by an iterator to an array | 131 -- Convert the values returned by an iterator to an array |
| 130 function it2array(f, s, var) | 132 function it.to_array(f, s, var) |
| 131 local t, var = {}; | 133 local t, var = {}; |
| 132 while true do | 134 while true do |
| 133 var = f(s, var); | 135 var = f(s, var); |
| 134 if var == nil then break; end | 136 if var == nil then break; end |
| 135 table.insert(t, var); | 137 table.insert(t, var); |
| 137 return t; | 139 return t; |
| 138 end | 140 end |
| 139 | 141 |
| 140 -- Treat the return of an iterator as key,value pairs, | 142 -- Treat the return of an iterator as key,value pairs, |
| 141 -- and build a table | 143 -- and build a table |
| 142 function it2table(f, s, var) | 144 function it.to_table(f, s, var) |
| 143 local t, var = {}; | 145 local t, var2 = {}; |
| 144 while true do | 146 while true do |
| 145 var, var2 = f(s, var); | 147 var, var2 = f(s, var); |
| 146 if var == nil then break; end | 148 if var == nil then break; end |
| 147 t[var] = var2; | 149 t[var] = var2; |
| 148 end | 150 end |
| 149 return t; | 151 return t; |
| 150 end | 152 end |
| 151 | 153 |
| 154 return it; |
