Skip to content

Instantly share code, notes, and snippets.

@andimiller
Created March 9, 2022 21:08
Show Gist options
  • Save andimiller/1d0193c5cae9fc0917f46120751bf4c1 to your computer and use it in GitHub Desktop.
Save andimiller/1d0193c5cae9fc0917f46120751bf4c1 to your computer and use it in GitHub Desktop.
-- Represents a chainable functional stream
-- mutable versions of methods are available under .mutate
function Stream(tbl)
stream = { values = tbl, mutate = {} }
function stream.mutate.map(f)
transform(stream.values, f)
return stream
end
function stream.map(f)
stream.values = map(stream.values, f)
return stream
end
function stream.tap(f)
tap(stream.values, f)
return stream
end
function stream.filter(f)
stream.values = filter(stream.values, f)
return stream
end
function stream.mutate.filter(f)
filterInplace(stream.values, f)
return stream
end
function stream.dump()
printtable(stream.values)
return stream
end
function stream.foldLeft(initial, merge)
return foldLeft(stream.values, initial, merge)
end
return stream
end
function foldLeft(tbl, initial, merge)
local acc = initial
for k, v in pairs(tbl) do
acc = merge(acc, v)
end
return acc
end
function printtable(tbl)
for k, v in pairs(tbl) do
print(k, "->", v)
end
end
function filter(tbl, f)
local t = {}
for k, v in pairs(tbl) do
if f(v) then t[k] = v end
end
return t
end
function filterInplace(tbl, f)
for k, v in pairs(tbl) do
if not f(v) then tbl[k] = nil end
end
end
function tap(tbl, f)
for k, v in pairs(tbl) do
f(v)
end
return tbl
end
function map(tbl, f)
local t = {}
for k,v in pairs(tbl) do
t[k] = f(v)
end
return t
end
function transform(tbl, f)
for k,v in pairs(tbl) do
tbl[k] = f(v)
end
return tbl
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment