Module:UtilsFunction

From Zelda Wiki, the Zelda encyclopedia
Jump to navigation Jump to search

The functions in this module return other functions, namely iterators. It also contains utility functions for functional programming.


local p = {}

function p.identity(...)
	return ...
end

function p.memoize(fn)
	local cache = {}
	return function(...)
		local key = mw.dumpObject({...})
		if not cache[key] then
			cache[key] = fn(...)
		end
		return cache[key]
	end
end

function p.negate(fn)
	return function(...)
		return not fn(...)
	end
end

function p.noop() 
	return nil
end

function p.peek(tbl)
	mw.logObject(tbl)
	return tbl
end

function p.pipe(...)
	local state = {...}
	return function(functions)
		for _, fn in ipairs(functions) do
			state = {fn(unpack(state))}
		end
		return unpack(state)
	end
end

-- http://lua-users.org/wiki/RangeIterator
function p.range(a, b, step)
  if not b then
    b = a
    a = 1
  end
  step = step or 1
  local f =
    step > 0 and
      function(_, lastvalue)
        local nextvalue = lastvalue + step
        if nextvalue <= b then return nextvalue end
      end or
    step < 0 and
      function(_, lastvalue)
        local nextvalue = lastvalue + step
        if nextvalue >= b then return nextvalue end
      end or
      function(_, lastvalue) return lastvalue end
  return f, nil, a - step
end

return p