Guest User

Working stream api

a guest
Mar 3rd, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.21 KB | None | 0 0
  1. function stream(input)
  2.   -- Local functions
  3.   -- local function _fn()
  4.   local function _concat(stream)
  5.     local data = input._data
  6.     for k, v in pairs(stream) do
  7.       input._data[k] = v
  8.     end
  9.     return _stream(data)
  10.   end
  11.  
  12.   local function _distinct(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(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(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(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(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(comp)
  76.     local data = input._data
  77.     table.sort(data, comp)
  78.     return _stream(data)
  79.   end
  80.  
  81.   local function _split(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(func)
  94.     for k, v in pairs(input._data) do
  95.       if func(v, k) then
  96.         return false
  97.       end
  98.     end
  99.     return true
  100.   end
  101.  
  102.   local function _anymatch(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(coll)
  112.     return coll(input._data)
  113.   end
  114.  
  115.   local function _count()
  116.     local count = 0
  117.     for k, v in pairs(input._data) do
  118.       count = count + 1
  119.     end
  120.     return count
  121.   end
  122.  
  123.   local function _foreach(func)
  124.     for k, v in pairs(input._data) do
  125.       func(v, k)
  126.     end
  127.   end
  128.  
  129.   local function _max(func)
  130.     local maxk = nil
  131.     for k, v in pairs(input._data) do
  132.       if maxk == nil then
  133.         maxk = k
  134.       else
  135.         maxk = func(v, input._data[maxk], k, maxk)
  136.       end
  137.     end
  138.     return maxk, input._data[maxk]
  139.   end
  140.  
  141.   local function _min(func)
  142.     local mink = nil
  143.     for k, v in pairs(input._data) do
  144.       if mink == nil then
  145.         mink = k
  146.       else
  147.         mink = func(v, input._data[mink], k, mink)
  148.       end
  149.       return mink, input._data[mink]
  150.     end
  151.   end
  152.  
  153.   local function _reduce(init, op)
  154.     local result = init
  155.     for k, v in pairs(input._data) do
  156.       result = op(result, v, k)
  157.     end
  158.     return result
  159.   end
  160.  
  161.   local function _toArray()
  162.     local result = input._data
  163.     return result
  164.   end
  165.  
  166.   local function _stream(input)
  167.     local result = {
  168.       _stream = true,
  169.       _data = input._data or input,
  170.       -- Intermediate Operations
  171.       concat = _concat,
  172.       distinct = _distinct,
  173.       filter = _filter,
  174.       limit = _limit,
  175.       map = _map,
  176.       skip = _skip,
  177.       sort = _sort,
  178.       split = _split,
  179.       -- Terminal Operations
  180.       allmatch = _allmatch,
  181.       anymatch = _anymatch,
  182.       collect = _collect,
  183.       count = _count,
  184.       foreach = _foreach,
  185.       max = _max,
  186.       min = _min,
  187.       nonematch = _nonematch,
  188.       reduce = _reduce,
  189.       toArray = _toArray
  190.     }
  191.     return result
  192.   end
  193.  
  194.   if input == nil then
  195.     error("input must be of type table, but was nil")
  196.   elseif type(input) ~= "table" then
  197.     error("input must be of type table, but was a "..type(input)..": "..input)
  198.   end
  199.  
  200.   input = _stream(input)
  201.   return input
  202. end
Add Comment
Please, Sign In to add comment