<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>https://www.ekopedia.fr/index.php?action=history&amp;feed=atom&amp;title=Module%3AIterateurs</id>
		<title>Module:Iterateurs - Historique des versions</title>
		<link rel="self" type="application/atom+xml" href="https://www.ekopedia.fr/index.php?action=history&amp;feed=atom&amp;title=Module%3AIterateurs"/>
		<link rel="alternate" type="text/html" href="https://www.ekopedia.fr/index.php?title=Module:Iterateurs&amp;action=history"/>
		<updated>2026-04-18T17:22:42Z</updated>
		<subtitle>Historique pour cette page sur le wiki</subtitle>
		<generator>MediaWiki 1.27.1</generator>

	<entry>
		<id>https://www.ekopedia.fr/index.php?title=Module:Iterateurs&amp;diff=126393&amp;oldid=prev</id>
		<title>- Hermes - : create</title>
		<link rel="alternate" type="text/html" href="https://www.ekopedia.fr/index.php?title=Module:Iterateurs&amp;diff=126393&amp;oldid=prev"/>
				<updated>2021-10-16T12:14:17Z</updated>
		
		<summary type="html">&lt;p&gt;create&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[[&lt;br /&gt;
---------------------------------------------------------------------------------&lt;br /&gt;
-- Iterating primitives &lt;br /&gt;
---------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Base functions to work on stateful lua iterators.&lt;br /&gt;
&lt;br /&gt;
Function that creates iterators, like &amp;quot;pair&amp;quot; and &amp;quot;ipair&amp;quot;, but stateful unlike them&lt;br /&gt;
&lt;br /&gt;
-- May be building a duplicate of https://www.wikidata.org/wiki/Module:Luafun &lt;br /&gt;
&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
----------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Copied From Luafun&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local methods = {} -- collects the methods to append to an iterator object&lt;br /&gt;
&lt;br /&gt;
local register_method = (function(module, methods)&lt;br /&gt;
	return function(name, func)&lt;br /&gt;
		module[name] = func&lt;br /&gt;
		methods[name] = func&lt;br /&gt;
	end&lt;br /&gt;
end)(p, methods)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- the metatable for an iterator object&lt;br /&gt;
local iterator_mt = {&lt;br /&gt;
    -- usually called by for-in loop&lt;br /&gt;
    __call = function(self, param, state)&lt;br /&gt;
        return self.gen(param, state)&lt;br /&gt;
    end;&lt;br /&gt;
    __tostring = function(self)&lt;br /&gt;
        return '&amp;lt;generator&amp;gt;'&lt;br /&gt;
    end;&lt;br /&gt;
    -- add all exported methods&lt;br /&gt;
    __index = methods;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- used to change an iterator function to an iterator objects to allow to attach methods to an iterator&lt;br /&gt;
local wrap = function(gen, param, state)&lt;br /&gt;
    return setmetatable({&lt;br /&gt;
        gen = gen,&lt;br /&gt;
        param = param,&lt;br /&gt;
        state = state&lt;br /&gt;
    }, iterator_mt), param, state&lt;br /&gt;
end&lt;br /&gt;
p.wrap = wrap&lt;br /&gt;
&lt;br /&gt;
local method0 = function(fun)&lt;br /&gt;
    return function(self)&lt;br /&gt;
        return fun(self.gen, self.param, self.state)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local methodn = function(fun)&lt;br /&gt;
    return function(self, ...) &lt;br /&gt;
       	return fun(self.gen, ...)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- iterator constructor. Transforms an iterator over a sequence of values in &lt;br /&gt;
-- an iterator on the result of the &amp;quot;value_constructor&amp;quot; function applied to the initial values&lt;br /&gt;
-- (a kind of an equivalent of the functional &amp;quot;map&amp;quot; function that works on iterator instead of list)&lt;br /&gt;
&lt;br /&gt;
-- this iterator works on values and ignore the keys&lt;br /&gt;
local function map(it, transformation)&lt;br /&gt;
	assert(it, &amp;quot;map : no iterator provided&amp;quot;)&lt;br /&gt;
	return wrap(&lt;br /&gt;
		function()&lt;br /&gt;
			local val = it()&lt;br /&gt;
			if val then return transformation(val) end&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
register_method(&amp;quot;map&amp;quot;, map)&lt;br /&gt;
&lt;br /&gt;
-- like &amp;quot;map&amp;quot; except it works on pairs of values (usually key/val pairs)&lt;br /&gt;
&lt;br /&gt;
-- this iterator works on pairs&lt;br /&gt;
local function pair_map(it, transformation)&lt;br /&gt;
	assert(it, &amp;quot;pair_map : no iterator provided&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	return wrap(&lt;br /&gt;
		function()&lt;br /&gt;
			local i, val = it()&lt;br /&gt;
			if i then return transformation(i, val) end&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
register_method(&amp;quot;pair_map&amp;quot;,pair_map)&lt;br /&gt;
&lt;br /&gt;
-- iterates on the values of another iterators and yield only the values that pass the criteria&lt;br /&gt;
-- (a kind of an equivalent of the functional &amp;quot;filter&amp;quot; function that works on iterator instead of list)&lt;br /&gt;
&lt;br /&gt;
-- this iterator works on values&lt;br /&gt;
local function filter(it, criteria)&lt;br /&gt;
	assert(it, &amp;quot;filter : no iterator provided&amp;quot;)&lt;br /&gt;
	assert(type(criteria)==&amp;quot;function&amp;quot;, &amp;quot;no criteria provided&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	return wrap(&lt;br /&gt;
		function()&lt;br /&gt;
			local val = it()&lt;br /&gt;
			while val and not(criteria(val)) do&lt;br /&gt;
				val = it()&lt;br /&gt;
			end&lt;br /&gt;
			return val&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
register_method(&amp;quot;filter&amp;quot;, filter)&lt;br /&gt;
&lt;br /&gt;
-- pair version of the previous function&lt;br /&gt;
&lt;br /&gt;
--this iterators works on pairs&lt;br /&gt;
local function pair_filter(it, criteria)&lt;br /&gt;
	assert(it, &amp;quot;pair_filter : no iterator provided&amp;quot;)&lt;br /&gt;
	return wrap(&lt;br /&gt;
		function()&lt;br /&gt;
			local i, val = it()&lt;br /&gt;
			while val and not(criteria(i, val)) do&lt;br /&gt;
				i, val = it()&lt;br /&gt;
			end&lt;br /&gt;
			return i, val&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
register_method(&amp;quot;pair_filter&amp;quot;, pair_filter)&lt;br /&gt;
&lt;br /&gt;
--creates a value only iterator from a &amp;quot;pair&amp;quot; one, yielding only the &amp;quot;keys&amp;quot; (first item of the pair)&lt;br /&gt;
&lt;br /&gt;
--this iterators works on pairs&lt;br /&gt;
local function select_keys(it)&lt;br /&gt;
	assert(it, &amp;quot;select_keys : no iterator provided&amp;quot;)&lt;br /&gt;
	return wrap(&lt;br /&gt;
		function()&lt;br /&gt;
			local i, val = it()&lt;br /&gt;
			return i&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
register_method(&amp;quot;select_keys&amp;quot;, select_keys)&lt;br /&gt;
&lt;br /&gt;
--creates a value only iterator from a &amp;quot;pair&amp;quot; one, yielding only the &amp;quot;values&amp;quot; (second item of the pair)&lt;br /&gt;
&lt;br /&gt;
--this iterators works on pairs&lt;br /&gt;
local function select_vals(it)&lt;br /&gt;
	assert(it, &amp;quot;pair_vals : no iterator provided&amp;quot;)&lt;br /&gt;
	return wrap(&lt;br /&gt;
		function()&lt;br /&gt;
			local i, val = it()&lt;br /&gt;
			return val&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.select_vals = select_vals&lt;br /&gt;
&lt;br /&gt;
-- create a stateful iterators that iterates on the values of a table&lt;br /&gt;
-- (from the stateless standard &amp;quot;pairs&amp;quot; iterator on tables)&lt;br /&gt;
local function on_vals(tabl)&lt;br /&gt;
    local _f, _s, _v  = pairs(tabl)&lt;br /&gt;
	return wrap(&lt;br /&gt;
		function()&lt;br /&gt;
			if _s then&lt;br /&gt;
				local i, res = _f(_s, _v)&lt;br /&gt;
				_v = i&lt;br /&gt;
				if not res then _s = nil end&lt;br /&gt;
				return res&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
p.on_vals = on_vals&lt;br /&gt;
&lt;br /&gt;
-- create a stateful iterators that iterates over the keys of a table&lt;br /&gt;
-- (from the stateless standard &amp;quot;pairs&amp;quot; iterator on tables)&lt;br /&gt;
local function on_pairs(tabl)&lt;br /&gt;
    local _f, _s, _v  = pairs(tabl)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
	return --wrap(&lt;br /&gt;
		function()&lt;br /&gt;
			if _s then&lt;br /&gt;
				local i, res = _f(_s, _v)&lt;br /&gt;
				_v = i&lt;br /&gt;
				if not res then _s = nil end&lt;br /&gt;
				return i, res&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	--)&lt;br /&gt;
end&lt;br /&gt;
p.on_pairs = on_pairs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- equivalent of the &amp;quot;join&amp;quot; operation, with join({{&amp;quot;a&amp;quot;},{},{&amp;quot;b&amp;quot;,&amp;quot;c&amp;quot;}}) = {&amp;quot;a&amp;quot;,&amp;quot;b&amp;quot;,&amp;quot;c&amp;quot;} &lt;br /&gt;
-- for iterators.&lt;br /&gt;
-- if the parameter &amp;quot;it&amp;quot; is an iterator that yields {&amp;quot;a&amp;quot;} ; then {} ; then {&amp;quot;b&amp;quot;,&amp;quot;c&amp;quot;} &lt;br /&gt;
-- and &amp;quot;creator&amp;quot; is a function that creates an iterator that yields &amp;quot;b&amp;quot; then &amp;quot;c&amp;quot; from the table {&amp;quot;b&amp;quot;,&amp;quot;c&amp;quot;}&lt;br /&gt;
-- the &amp;quot;flatten&amp;quot;-ing of this parameter will yield &amp;quot;a&amp;quot; then &amp;quot;b&amp;quot; then &amp;quot;c&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local function flatten(it, creator)&lt;br /&gt;
	assert(it, &amp;quot;flatten : no iterator provided&amp;quot;)&lt;br /&gt;
	assert(creator, &amp;quot;flatten : no iterator creator provided&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local main_val = it()&lt;br /&gt;
	&lt;br /&gt;
	if main_val then&lt;br /&gt;
		local sub_it = creator(main_val)&lt;br /&gt;
		return wrap(&lt;br /&gt;
			function()&lt;br /&gt;
				if main_val then&lt;br /&gt;
					local val = nil&lt;br /&gt;
					while not val and main_val do&lt;br /&gt;
						if sub_it then&lt;br /&gt;
							val = sub_it()&lt;br /&gt;
						end&lt;br /&gt;
						if not val then&lt;br /&gt;
							main_val = it()&lt;br /&gt;
							if not main_val then return end&lt;br /&gt;
							sub_it = creator(main_val)&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					return val&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		)&lt;br /&gt;
	else&lt;br /&gt;
		return wrap(function () return nil end)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
register_method(&amp;quot;flatten&amp;quot;, flatten)&lt;br /&gt;
&lt;br /&gt;
-- equivalent of list concatenation for iterators&lt;br /&gt;
&lt;br /&gt;
local chain = function (it1, it2)&lt;br /&gt;
	return wrap(&lt;br /&gt;
		function()&lt;br /&gt;
			local res = it1() or it2()&lt;br /&gt;
			return res&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
register_method(&amp;quot;chain&amp;quot;, chain)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- creates an iterator on a single value&lt;br /&gt;
&lt;br /&gt;
p.singleton = function (val)&lt;br /&gt;
	local iterated&lt;br /&gt;
	return wrap(function()&lt;br /&gt;
		if not iterated then&lt;br /&gt;
			iterated = true&lt;br /&gt;
			return val&lt;br /&gt;
		end&lt;br /&gt;
	end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function fold(it, acc, init)&lt;br /&gt;
	local accum = init&lt;br /&gt;
	for res in it do&lt;br /&gt;
		accum = acc(res, accum)&lt;br /&gt;
	end&lt;br /&gt;
	return accum&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
register_method(&amp;quot;fold&amp;quot;, fold)&lt;br /&gt;
&lt;br /&gt;
local function totable(it)&lt;br /&gt;
	return fold(&lt;br /&gt;
		it, &lt;br /&gt;
		function (val, tabl)&lt;br /&gt;
			table.insert(tabl, val)&lt;br /&gt;
			return tabl&lt;br /&gt;
		end,&lt;br /&gt;
		{}&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
register_method(&amp;quot;totable&amp;quot;, totable)&lt;br /&gt;
&lt;br /&gt;
function p.range(start_i, end_i, step)&lt;br /&gt;
	local i = nil&lt;br /&gt;
	step = step or 1&lt;br /&gt;
	&lt;br /&gt;
	assert(step ~= 0)&lt;br /&gt;
	&lt;br /&gt;
	local direction = step/math.abs(step)&lt;br /&gt;
	&lt;br /&gt;
	return wrap(function()&lt;br /&gt;
		if not i then &lt;br /&gt;
			i = start_i&lt;br /&gt;
		else&lt;br /&gt;
			i = i + step&lt;br /&gt;
		end&lt;br /&gt;
		if i * direction &amp;lt; end_i * direction then &lt;br /&gt;
			return i&lt;br /&gt;
		else&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
	end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- TESTING FUNCTIONS&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.execute(iterator)&lt;br /&gt;
	for x in iterator do&lt;br /&gt;
		mw.log(x)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.execute_pair(iterator)&lt;br /&gt;
	for x, y in iterator do&lt;br /&gt;
		mw.log(x, y)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>- Hermes -</name></author>	</entry>

	</feed>