Guest User

stream.lua

a guest
Mar 1st, 2018
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.03 KB | None | 0 0
  1. function stream(input)
  2.   -- Local functions
  3.   -- local function _fn()
  4.   local function _concat(str)
  5.     local data = input._data
  6.     for k, v in pairs(str) do
  7.       data[k] = v
  8.     end
  9.     return _stream(data)
  10.   end
  11.  
  12.   local function _distinct(input,func)
  13.     func = func or (function(v) return v end)
  14.     local data = {}
  15.     for k1, v1 in pairs(input._data) do
  16.       local notExist = true
  17.       for k2, v2 in pairs(data) do
  18.         if k1 ~= k2 and func(v1) == func(v2) then
  19.           exist = false
  20.           break
  21.         end
  22.       end
  23.       if notExist then
  24.         data[k1] = v1
  25.       end
  26.     end
  27.     return _stream(data)
  28.   end
  29.  
  30.   local function _filter(input,func)
  31.     local data = {}
  32.     for k, v in pairs(input._data) do
  33.       if func(v) then
  34.         data[k] = v
  35.       end
  36.     end
  37.     return _stream(data)
  38.   end
  39.  
  40.   local function _limit(input,n)
  41.     local counter = 0
  42.     local data = {}
  43.     for k, v in pairs(input._data) do
  44.       if counter < n then
  45.         data[k] = v
  46.         counter = counter + 1
  47.         if counter == n then
  48.           break
  49.         end
  50.       end
  51.     end
  52.     return _stream(data)
  53.   end
  54.  
  55.   local function _map(input,func)
  56.     local data = {}
  57.     for k, v in pairs(input._data) do
  58.       data[k] = func(v, k)
  59.     end
  60.     return _stream(data)
  61.   end
  62.  
  63.   local function _skip(input,n)
  64.     local counter = 0
  65.     local data = {}
  66.     for k, v in pairs(input._data) do
  67.       if counter % n == 0 then
  68.         data[k] = v
  69.       end
  70.       counter = counter + 1
  71.     end
  72.     return _stream(data)
  73.   end
  74.  
  75.   local function _sort(input,comp)
  76.     local data = input._data
  77.     table.sort(data, comp)
  78.     return _stream(data)
  79.   end
  80.  
  81.   local function _split(input,func)
  82.     local data1, data2 = {}
  83.     for k, v in pairs(input._data) do
  84.       if func(v, k) then
  85.         data1[k] = v
  86.       else
  87.         data2[k] = v
  88.       end
  89.     end
  90.     return _stream(data1), _stream(data2)
  91.   end
  92.  
  93.   local function _allmatch(input,func)
  94.     for k, v in pairs(input._data) do
  95.       if func(v, k) == false then
  96.         return false
  97.       end
  98.     end
  99.     return true
  100.   end
  101.  
  102.   local function _anymatch(input,func)
  103.     for k, v in pairs(input._data) do
  104.       if func(v, k) then
  105.         return true
  106.       end
  107.     end
  108.     return false
  109.   end
  110.  
  111.   local function _collect(input,coll)
  112.     return coll(input._data)
  113.   end
  114.  
  115.   local function _count(input)
  116.     return #input._data
  117.   end
  118.  
  119.   local function _foreach(input,func)
  120.     for k, v in pairs(input._data) do
  121.       func(v, k)
  122.     end
  123.   end
  124.  
  125.   local function _max(input,func)
  126.     local maxk = nil
  127.     for k, v in pairs(input._data) do
  128.       if maxk == nil then
  129.         maxk = k
  130.       else
  131.         maxk = func(v, input._data[maxk], k, maxk)
  132.       end
  133.     end
  134.     return maxk, input._data[maxk]
  135.   end
  136.  
  137.   local function _min(input,func)
  138.     local mink = nil
  139.     for k, v in pairs(input._data) do
  140.       if mink == nil then
  141.         mink = k
  142.       else
  143.         mink = func(v, input._data[mink], k, mink)
  144.       end
  145.       return mink, input._data[mink]
  146.     end
  147.   end
  148.  
  149.   local function _nonematch(input,func)
  150.     for k, v in pairs(input._data) do
  151.       if func(v, k) then
  152.         return false
  153.       end
  154.     end
  155.     return true
  156.   end
  157.  
  158.   local function _reduce(input,init,op)
  159.     local result = init
  160.     for k, v in pairs(input._data) do
  161.       result = op(result, v, k)
  162.     end
  163.     return result
  164.   end
  165.  
  166.   local function _toArray(input)
  167.     local result = input._data
  168.     return result
  169.   end
  170.  
  171.   local function _stream(input)
  172.     local result = {
  173.       _stream = true,
  174.       _data = input._data or input,
  175.       -- Intermediate Operations
  176.       concat = function(str) return _concat(input,str) end,
  177.       distinct = function(func) return _distinct(input,func) end,
  178.       filter = function(func) return _filter(input,func) end,
  179.       limit = function(n) return _limit(input,n) end,
  180.       map = function(func) return _map(input,func) end,
  181.       skip = function(n) return _skip(input,n) end,
  182.       sort = function(func) return _sort(input,func) end,
  183.       split = function(func) return _split(input,func) end,
  184.       -- Terminal Operations
  185.       allmatch = function(func) return _allmatch(input,func) end,
  186.       anymatch = function(func) return _anymatch(input,func) end,
  187.       collect = function(coll) return _collect(input,coll) end,
  188.       count = function() return _count(input) end,
  189.       foreach = function(func) return _foreach(input,func) end,
  190.       max = function(func) return _max(input,func) end,
  191.       min = function(func) return _min(input,func) end,
  192.       nonematch = function(func) return _nonematch(input,func) end,
  193.       reduce = function(init,op) return _reduce(input,init,op) end,
  194.       toArray = function() return _toArray(input) end
  195.     }
  196.     return result
  197.   end
  198.  
  199.   if input == nil then
  200.     error("input must be of type table, but was nil")
  201.   elseif type(input) ~= "table" then
  202.     error("input must be of type table, but was a "..type(input)..": "..input)
  203.   end
  204.   return _stream(input)
  205. end
  206.  
  207. table.stream = stream
Add Comment
Please, Sign In to add comment