Advertisement
Guest User

LinqArray

a guest
Feb 4th, 2012
439
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.47 KB | None | 0 0
  1. LinqArray = class()
  2.  
  3. function LinqArray:init(items)
  4.     if items then
  5.         self:addRange(items)
  6.     end
  7. end
  8.  
  9. function LinqArray:add(item)
  10.     table.insert(self, item)
  11. end
  12.  
  13. function LinqArray:addRange(items)
  14.     for k,v in ipairs(items) do
  15.         self:add(v)
  16.     end
  17. end
  18.  
  19. function LinqArray:where(func)
  20.     local results = LinqArray()
  21.     for k, v in ipairs(self) do
  22.         if func(v) then
  23.             results:add(v)
  24.         end
  25.     end
  26.     
  27.     return results
  28. end
  29.  
  30. function LinqArray:select(func)
  31.     local results = LinqArray()
  32.     for k, v in ipairs(self) do
  33.         results:add(func(v))
  34.     end
  35.     
  36.     return results
  37. end
  38.  
  39. function LinqArray:selectMany(func)
  40.     local results = LinqArray()
  41.     local selectResults = self:select(func)
  42.     
  43.     for _,item in ipairs(selectResults) do
  44.         results:addRange(item)
  45.     end
  46.     
  47.     return results
  48. end
  49.  
  50. function LinqArray:count()
  51.     return # self
  52. end
  53.  
  54. function LinqArray:first() return self[1] end
  55.  
  56. function LinqArray:distinct(objHashFunc)
  57.     local results = LinqArray()
  58.     local valueExists = {}
  59.     
  60.     if objHashFunc then
  61.         for k, v in ipairs(self) do
  62.             if not valueExists[objHashFunc(v)] then
  63.                 results:add(v)
  64.                 valueExists[objHashFunc(v)] = true
  65.             end
  66.         end
  67.     else
  68.         for k, v in ipairs(self) do
  69.             if not valueExists[v] then
  70.                 results:add(v)
  71.                 valueExists[v] = true
  72.             end
  73.         end
  74.     end
  75.     
  76.     return results
  77. end
  78.  
  79. function LinqArray:toDictionary(keyFunc, valueFunc)
  80.     local results = {}
  81.     for k, v in ipairs(self) do
  82.         results[keyFunc(v)] = valueFunc(v)
  83.     end
  84.     
  85.     return results
  86. end
  87.  
  88. function LinqArray:sum(func)
  89.     local sum = 0
  90.     
  91.     if func then
  92.         for k, v in ipairs(self) do
  93.             sum = sum + func(v)
  94.         end
  95.     else
  96.         for k, v in ipairs(self) do
  97.             sum = sum + v
  98.         end
  99.     end
  100.     
  101.     return sum
  102. end
  103.  
  104. function LinqArray:avg(func)
  105.     return self:sum(func) / self:count()
  106. end
  107.  
  108. function LinqArray:any(func)
  109.     local results = self
  110.     if func then
  111.         results = results:where(func)
  112.     end
  113.     return results:count() > 0
  114. end
  115.  
  116. function LinqArray:minOrMax(selector, cond)
  117.     local curResult = nil
  118.     local curVal
  119.     
  120.     for _,i in ipairs(self) do
  121.         if selector then
  122.             curVal = selector(i)
  123.         else
  124.             curVal = i
  125.         end
  126.                 
  127.         if not curResult then
  128.             curResult = curVal
  129.         elseif cond(curVal, curResult) then
  130.             curResult = curVal
  131.         end
  132.     end
  133.     
  134.     return curResult
  135. end
  136.  
  137. function LinqArray:min(selector)
  138.     return self:minOrMax(selector, function(a,b) return a < b end)
  139. end
  140.  
  141. function LinqArray:max(selector)
  142.     return self:minOrMax(selector, function(a,b) return a > b end)
  143. end
  144.  
  145. function LinqArray:removeWhere(func)
  146.     local i = 1
  147.     while i <= self:count() do
  148.         if func(self[i]) then
  149.             table.remove(self, i)
  150.         else
  151.             i = i + 1
  152.         end
  153.     end
  154. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement