Created
August 18, 2019 19:14
-
-
Save vorce/60ffdd3be4ef25c7d910591389c37380 to your computer and use it in GitHub Desktop.
Some functional utilities
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- functional programming utilities | |
-- usage: local fn = require "fn" | |
NAME = "fn" | |
local M = { } | |
-- Invokes the reducer function for each element in the collection with the accumulator. | |
-- The initial value of the accumulator is initial. The function is invoked for each | |
-- element in the enumerable with the accumulator. The result returned by the | |
-- function is used as the accumulator for the next iteration. The function | |
-- returns the last accumulator. | |
-- This function is a building block for a lot of other utilities. | |
local function reduce(collection, initial, reducer) | |
local accumulator = initial | |
for k, v in pairs(collection) do | |
accumulator = reducer({key = k, value = v}, accumulator) | |
end | |
return accumulator | |
end | |
-- returns the collection with its items transformed by the mapper function | |
-- mapper example: | |
-- local doubleUp = function (kv) | |
-- return kv.value * 2 | |
-- end | |
local function map(collection, mapper) | |
return reduce(collection, {}, function (kv, acc) | |
table.insert(acc, mapper(kv)) | |
return acc | |
end) | |
end | |
-- return a collection containing only items where the predicate function returns true | |
-- predicate example: | |
-- local isEven = function (kv) | |
-- return (k.value % 2) == 0 | |
-- end | |
local function filter(collection, predicate) | |
return reduce(collection, {}, function (kv, acc) | |
if predicate(kv) then | |
table.insert(acc, kv.value) | |
end | |
return acc | |
end) | |
end | |
-- opposite of filter | |
local function reject(collection, predicate) | |
return reduce(collection, {}, function (kv, acc) | |
if not predicate(kv) then | |
table.insert(acc, kv.value) | |
end | |
return acc | |
end) | |
end | |
M.reduce = reduce | |
M.map = map | |
M.filter = filter | |
M.reject = reject | |
return M |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment