Guest User

Untitled

a guest
Dec 11th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.37 KB | None | 0 0
  1. local function empty(tbl)
  2. if type(tbl) == 'string' then return #tbl == 0 end
  3. if type(tbl) ~= 'table' then return true end
  4. if #tbl ~= 0 then return false end
  5. for k, v in pairs(tbl) do return false end
  6. return true
  7. end
  8.  
  9. local function len(tbl)
  10. if type(tbl) ~= 'table' then return 0 end
  11. local count = 0
  12. for k, v in pairs(tbl) do count = count + 1 end
  13. return count
  14. end
  15.  
  16. local function concat1(a, b)
  17. for _, v in ipairs(b) do table.insert(a, v) end
  18. return a
  19. end
  20.  
  21. local function concat(...)
  22. t = {}
  23. for _, v in ipairs({...}) do concat1(t, v) end
  24. return t
  25. end
  26.  
  27. local function assign1(a, b)
  28. for k, v in pairs(b) do a[k] = v end
  29. return a
  30. end
  31.  
  32. local function assign(t, ...)
  33. for _, v in ipairs({...}) do assign1(t, v) end
  34. return t
  35. end
  36.  
  37. local function spread(...) return assign({}, ...) end
  38.  
  39. local function curryFlip(action)
  40. return function (func) return function (...) return action(..., func) end end
  41. end
  42.  
  43. function eval(strFunc)
  44. local func, err = loadstring('return function (x) return '..strFunc..' end')
  45. if err then print(err) end
  46. return func()
  47. end
  48.  
  49. local function map(tbl, func)
  50. if type(func) == 'string' then func = eval(func) end
  51. local t = {}
  52. for k, v in pairs(tbl) do t[k] = func(v, k) end
  53. return t
  54. end
  55.  
  56. local function get(tbl, key) return tbl[key] end
  57.  
  58. local function filter(tbl, func)
  59. if type(func) == 'string' then func = eval(func) end
  60. local t = {}
  61. for k, v in pairs(tbl) do if func(v) then t[k] = v end end
  62. return t
  63. end
  64.  
  65. local function fold(tbl, acc, func)
  66. if type(func) == 'string' then func = eval(func) end
  67. for k, v in pairs(tbl) do acc = func(acc, v, k) end
  68. return acc
  69. end
  70.  
  71. local function reduce(tbl, func)
  72. if type(func) == 'string' then func = eval(func) end
  73. if (empty(tbl)) then error('reduce was called with an empty table') end
  74. local head = table.remove(tbl, 1)
  75. return fold(tbl, head, func)
  76. end
  77.  
  78. local function join(tbl, sep)
  79. if type(tbl) ~= 'table' then return '' end
  80. return table.concat(tbl, sep or '')
  81. end
  82.  
  83. local function nTbl(n)
  84. local t = {}
  85. for i = 1, n do t[i] = i end
  86. return t
  87. end
  88.  
  89. local function keys(tbl)
  90. local t = {}
  91. for k, _ in pairs(list) do table.insert(t, k) end
  92. return t
  93. end
  94.  
  95. local function uniq(tbl)
  96. local t = {}
  97. for _, l in ipairs(list) do
  98. t[l] = true
  99. end
  100. return keys(t)
  101. end
  102.  
  103. local function flat(tbl)
  104. local t = {}
  105. for _, v in ipairs(tbl) do
  106. if not type(v) == 'table' then
  107. table.insert(t, v)
  108. else
  109. for _, vv in ipairs(v) do
  110. table.insert(t, vv)
  111. end
  112. end
  113. end
  114. return t
  115. end
  116.  
  117. local T = {}
  118. setmetatable(T, {
  119. __call = function (self, ...)
  120. local args = {...}
  121. if #args == 0 then return setmetatable({}, T) end
  122. if #args == 1 then
  123. local arg = args[1]
  124. if not arg then return setmetatable({}, T) end
  125. if type(arg) == 'table' then return setmetatable(arg, T) end
  126. return setmetatable({arg}, T)
  127. end
  128. return setmetatable(args, T)
  129. end
  130. })
  131.  
  132. -- T.__len =
  133. -- T.__tostring =
  134.  
  135. T.__concat = function (self, tbl)
  136. --print('lhs', self)
  137. --print('rhs', tbl)
  138. return setmetatable(assign1(assign1({}, self), tbl), T)
  139. end
  140.  
  141. local function register(proto, name, func)
  142. if not proto.__index then proto.__index = { new = proto } end
  143. proto.__index[name] = func
  144. end
  145.  
  146. local function registerChained(proto, name, func)
  147. return register(proto, name, function (...)
  148. return setmetatable(func(...), proto)
  149. end)
  150. end
  151.  
  152. local g = T({ abc = 'abc' })..T({ def = 'def' })
  153.  
  154. for k, v in pairs(g) do print(k, v) end
  155.  
  156. --local g2 = g:map(function (n) return n..tostring(12) end)
  157.  
  158. --for k, v in pairs(g2) do print(k, v) end
  159.  
  160. function slice(tbl, first, last, step)
  161. local size = #tbl
  162. if first < 0 then first = size + first end
  163. if last < 0 then last = size + last end
  164. local t = {}
  165. for i = first or 1, last or size, step or 1 do
  166. table.insert(t, tbl[i])
  167. end
  168. return t
  169. end
  170.  
  171.  
  172. local mapper = curryFlip(map)
  173. local filterer = curryFlip(filter)
  174. local folder = curryFlip(fold)
  175. local reducer = curryFlip(fold)
  176. local joiner = curryFlip(join)
  177. local getter = curryFlip(get)
  178. registerChained(T, 'map', map)
  179. registerChained(T, 'fold', fold)
  180. registerChained(T, 'slice', slice)
  181. registerChained(T, 'filter', filter)
  182. registerChained(T, 'reduce', reduce)
  183.  
  184. register(T, 'join', join)
  185. register(T, 'set', function (self, key, value)
  186. return self..{ [key] = value }
  187. end)
  188.  
  189. for i,v in ipairs(nTbl(20)) do
  190. print(i,v)
  191. end
  192.  
  193.  
  194. print(T(nTbl(20))
  195. :slice(2, -2)
  196. :filter('x % 2 == 0')
  197. :map('x + 10')
  198. :join('-'))
Add Comment
Please, Sign In to add comment