local yield = coroutine.yield; -- Helper functie om een nieuwe IteratorWrapper te maken local function createWrapper(iter, generator) return setmetatable({ iter = coroutine.wrap(function() for value in iter do generator(value) end end) }, IteratorWrapper) end -- Defineer de IteratorWrapper class IteratorWrapper = {} IteratorWrapper.__index = IteratorWrapper function IteratorWrapper.new(iterable) local self = setmetatable({}, IteratorWrapper) self.iter = coroutine.wrap(function() for _, v in ipairs(iterable) do yield(v) end end) return self end function IteratorWrapper:map(f) return createWrapper(self.iter, function(value) yield(f(value)) end) end function IteratorWrapper:filter(predicate) return createWrapper(self.iter, function(value) if predicate(value) then yield(value) end end) end function IteratorWrapper:take(n) local count = 0 return createWrapper(self.iter, function(value) if count < n then yield(value) count = count + 1 end end) end function IteratorWrapper:first() return self.iter() -- Haalt direct het eerste item uit de iterator end function IteratorWrapper:toArray() local result = {} for x in self.iter do table.insert(result, x) end return result end -- Functie om van een lijst een IteratorWrapper te maken function from(iterable) return IteratorWrapper.new(iterable) end local numbers = { 1, 2, 3, 4, 5 } local firstResult = from(numbers) :map(function(x) return x * 2 end) :filter(function(x) return x > 5 end) :first() print(firstResult) -- Output: 6 local result = from(numbers) :map(function(x) return x * 2 end) :filter(function(x) return x > 5 end) :take(2) :toArray() for _, v in ipairs(result) do print(v) -- Output: 6, 8 end
886500cookie-checkLua IteratorWrapper