util/iterators.lua
changeset 5581 167c1da54606
parent 5468 2660407c3b73
child 5582 7bc2009fdd0c
equal deleted inserted replaced
5580:db5d1a350cc7 5581:167c1da54606
     8 
     8 
     9 --[[ Iterators ]]--
     9 --[[ Iterators ]]--
    10 
    10 
    11 local it = {};
    11 local it = {};
    12 
    12 
       
    13 local t_insert = table.insert;
       
    14 local select, unpack, next = select, unpack, next;
       
    15 local function pack(...) return { n = select("#", ...), ... }; end
       
    16 
    13 -- Reverse an iterator
    17 -- Reverse an iterator
    14 function it.reverse(f, s, var)
    18 function it.reverse(f, s, var)
    15 	local results = {};
    19 	local results = {};
    16 
    20 
    17 	-- First call the normal iterator
    21 	-- First call the normal iterator
    18 	while true do
    22 	while true do
    19 		local ret = { f(s, var) };
    23 		local ret = { f(s, var) };
    20 		var = ret[1];
    24 		var = ret[1];
    21 	        if var == nil then break; end
    25 	        if var == nil then break; end
    22 		table.insert(results, 1, ret);
    26 		t_insert(results, 1, ret);
    23 	end
    27 	end
    24 	
    28 	
    25 	-- Then return our reverse one
    29 	-- Then return our reverse one
    26 	local i,max = 0, #results;
    30 	local i,max = 0, #results;
    27 	return function (results)
    31 	return function (results)
    53 function it.unique(f, s, var)
    57 function it.unique(f, s, var)
    54 	local set = {};
    58 	local set = {};
    55 	
    59 	
    56 	return function ()
    60 	return function ()
    57 		while true do
    61 		while true do
    58 			local ret = { f(s, var) };
    62 			local ret = pack(f(s, var));
    59 			var = ret[1];
    63 			var = ret[1];
    60 		        if var == nil then break; end
    64 		        if var == nil then break; end
    61 		        if not set[var] then
    65 		        if not set[var] then
    62 				set[var] = true;
    66 				set[var] = true;
    63 				return var;
    67 				return unpack(ret, 1, ret.n);
    64 			end
    68 			end
    65 		end
    69 		end
    66 	end;
    70 	end;
    67 end
    71 end
    68 
    72 
    69 --[[ Return the number of items an iterator returns ]]--
    73 --[[ Return the number of items an iterator returns ]]--
    70 function it.count(f, s, var)
    74 function it.count(f, s, var)
    71 	local x = 0;
    75 	local x = 0;
    72 	
    76 	
    73 	while true do
    77 	while true do
    74 		local ret = { f(s, var) };
    78 		local var = f(s, var);
    75 		var = ret[1];
       
    76 	        if var == nil then break; end
    79 	        if var == nil then break; end
    77 		x = x + 1;
    80 		x = x + 1;
    78 	end
    81 	end
    79 	
    82 	
    80 	return x;
    83 	return x;
   102 
   105 
   103 -- Return the last n items an iterator returns
   106 -- Return the last n items an iterator returns
   104 function it.tail(n, f, s, var)
   107 function it.tail(n, f, s, var)
   105 	local results, count = {}, 0;
   108 	local results, count = {}, 0;
   106 	while true do
   109 	while true do
   107 		local ret = { f(s, var) };
   110 		local ret = pack(f(s, var));
   108 		var = ret[1];
   111 		var = ret[1];
   109 	        if var == nil then break; end
   112 	        if var == nil then break; end
   110 		results[(count%n)+1] = ret;
   113 		results[(count%n)+1] = ret;
   111 		count = count + 1;
   114 		count = count + 1;
   112 	end
   115 	end
   115 
   118 
   116 	local pos = 0;
   119 	local pos = 0;
   117 	return function ()
   120 	return function ()
   118 		pos = pos + 1;
   121 		pos = pos + 1;
   119 		if pos > n then return nil; end
   122 		if pos > n then return nil; end
   120 		return unpack(results[((count-1+pos)%n)+1]);
   123 		local ret = results[((count-1+pos)%n)+1];
       
   124 		return unpack(ret, 1, ret.n);
   121 	end
   125 	end
   122 	--return reverse(head(n, reverse(f, s, var)));
   126 	--return reverse(head(n, reverse(f, s, var)));
   123 end
   127 end
   124 
   128 
   125 local function _ripairs_iter(t, key) if key > 1 then return key-1, t[key-1]; end end
   129 local function _ripairs_iter(t, key) if key > 1 then return key-1, t[key-1]; end end
   137 function it.to_array(f, s, var)
   141 function it.to_array(f, s, var)
   138 	local t, var = {};
   142 	local t, var = {};
   139 	while true do
   143 	while true do
   140 		var = f(s, var);
   144 		var = f(s, var);
   141 	        if var == nil then break; end
   145 	        if var == nil then break; end
   142 		table.insert(t, var);
   146 		t_insert(t, var);
   143 	end
   147 	end
   144 	return t;
   148 	return t;
   145 end
   149 end
   146 
   150 
   147 -- Treat the return of an iterator as key,value pairs,
   151 -- Treat the return of an iterator as key,value pairs,