Advertisement
Guest User

Untitled

a guest
Dec 22nd, 2010
313
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 1.58 KB | None | 0 0
  1. -- Lua version, using a more functional style
  2. -- ~ 23 ms, using LuaJIT 2.0.0-beta5
  3.  
  4. -- we use a single function to emulate input ranges
  5. -- calling the function gets the next item, nil if the range is empty
  6.  
  7. function iota(start, upper)
  8.     return function()
  9.         if start >= upper then
  10.             return nil
  11.         end
  12.         local res = start
  13.         start = start + 1
  14.         return res
  15.     end
  16. end
  17.  
  18. function map(range, fn)
  19.     fn = fixfunction(fn, "a")
  20.     return function()
  21.         local val = range()
  22.         if val == nil then
  23.             return nil
  24.         end
  25.         return fn(val)
  26.     end
  27. end
  28.  
  29. function reduce(range, fn)
  30.     fn = fixfunction(fn, "a, b")
  31.     local val = range()
  32.     if val == nil then
  33.         return nil
  34.     end
  35.     while true do
  36.         local val2 = range()
  37.         if val2 == nil then
  38.             break
  39.         end
  40.         val = fn(val, val2)
  41.     end
  42.     return val
  43. end
  44.  
  45. -- std.algorithm style string lambdas support
  46. function fixfunction(fn, params)
  47.     if type(fn) ~= "function" then
  48.         fn = loadstring("return function(" .. params .. ") return " .. fn .. " end")
  49.         fn = fn()
  50.     end
  51.     return fn
  52. end
  53.  
  54. -- hint: numbers in Lua always use double floating point type
  55. L = iota(0, 10000000)
  56.  
  57. L2 = map(L, function(a) return a / 2 end)
  58. L3 = map(L2, function(a) return a + 2 end)
  59. V = reduce(L3, function(a, b) return a + b end)
  60.  
  61. -- uncomment this if you love using strings for lambdas
  62. -- runs as fast as the "proper" version above
  63. --[[
  64. L2 = map(L, "a/2")
  65. L3 = map(L2, "a+2")
  66. V = reduce(L3, "a+b")
  67. --]]
  68.  
  69. print(V)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement