Advertisement
Freack100

RandomUtils

Dec 7th, 2016
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 9.55 KB | None | 0 0
  1. local function _W(f) local e=setmetatable({}, {__index = _ENV or getfenv()}) if setfenv then setfenv(f, e) end return f(e) or e end
  2. local Core=_W(function(_ENV, ...)
  3. local Core = {}
  4.  
  5. function Core.identity(o)
  6.   return o
  7. end
  8.  
  9. function Core.isEqual(v,vv)
  10.   if(type(v) ~= type(vv)) then return false end
  11.   if(type(v) == "table") then
  12.     for k,v in pairs(v) do
  13.       if(vv[k] ~= v) then
  14.         return false
  15.       end
  16.     end
  17.     return true
  18.   end
  19.   return v==vv
  20. end
  21.  
  22. function Core.toBoolean(v)
  23.   return v and true or false
  24. end
  25.  
  26. function Core.isCallable(v)
  27.   if(type(v) == "table") then
  28.     return type(getmetatable(v).__call) == "function"
  29.   end
  30.   return type(v) == "function"
  31. end
  32.  
  33. function Core.isTable(v)
  34.   return type(v) == "table"
  35. end
  36.  
  37. function Core.isNil(v)
  38.   return v == nil
  39. end
  40.  
  41. function Core.isArray(v)
  42.   if not Core.isTable(v) then return false end
  43.   local i = 0
  44.   for _,_ in pairs(v) do
  45.     i = i + 1
  46.     if Core.isNil(v[i]) then return false end
  47.   end
  48.   return true
  49. end
  50.  
  51. function Core.isIterable(v)
  52.   return Core.toBoolean(pcall(pairs,v))
  53. end
  54.  
  55. function Core.isString(v)
  56.   return type(v) == "string"
  57. end
  58.  
  59. function Core.isEmpty(v)
  60.   if Core.isNil(v) then return true end
  61.   if Core.isString(v) then return #v == 0 end
  62.   if Core.isTable(v) then return next(v) == nil end
  63.   return true
  64. end
  65.  
  66. function Core.isNumber(v)
  67.   return type(v) == "number"
  68. end
  69.  
  70. function Core.isNaN(v)
  71.   return Core.isNumber(v) and v ~= v
  72. end
  73.  
  74. function Core.isFinite(v)
  75.   if not Core.isNumber(v) then return false end
  76.   return v > -math.huge and v < math.huge
  77. end
  78.  
  79. function Core.isBoolean(v)
  80.   return type(v) == "boolean"
  81. end
  82.  
  83. function Core.isInteger(v)
  84.   return type(v) == "number" and math.floor(v) == v
  85. end
  86.  
  87. function Core.once(f)
  88.   local ran = false
  89.   local res = false
  90.   return function(...)
  91.     if(ran) then return res end
  92.     res = f(unpack({...}))
  93.     return res
  94.   end
  95. end
  96.  
  97. function Core.functions(obj)
  98.   local methods = {}
  99.   for k,v in pairs(obj) do
  100.     if(type(v) == "function") then
  101.       table.insert(methods,k)
  102.     end
  103.   end
  104.   return methods
  105. end
  106.  
  107. function Core.clone(obj)
  108.   if(type(obj) ~= "table") then return obj end
  109.   local t = {}
  110.   for k,v in pairs(obj) do
  111.     t[Core.clone(k)] = Core.clone(v)
  112.   end
  113.   return t
  114. end
  115.  
  116. function Core.result(obj,method,...)
  117.   if(obj[method]) then
  118.     if(Core.isCallable(obj[method])) then
  119.       return obj[method](obj,...)
  120.     else
  121.       return obj[method]
  122.     end
  123.   elseif _.isCallable(method) then
  124.     return method(obj,...)
  125.   end
  126. end
  127.  
  128. function Core.memoize(f,hash)
  129.   local h = hash or Core.identity
  130.   local mem = {}
  131.   return function(...)
  132.     for k,v in pairs(mem) do
  133.       if(Core.isEqual(k,{...})) then return v end
  134.     end
  135.     local res = f(...)
  136.     mem[{...}] = res
  137.     return res
  138.   end
  139. end
  140.  
  141. function Core.after(f,count)
  142.   local i,l = 0,count
  143.   return function(...)
  144.     i = i + 1
  145.     if(i>=l) then return f(...) end
  146.   end
  147. end
  148.  
  149. function Core.compose(...)
  150.   local functions = {...}
  151.   return function(...)
  152.     local ret = functions[1](...)
  153.     for k,v in pairs(functions) do
  154.       if(k~=1) then ret = v(ret) end
  155.     end
  156.     return ret
  157.   end
  158. end
  159.  
  160. function Core.pipe(value,...)
  161.   return Core.compose(...)(value)
  162. end
  163.  
  164. function Core.times(n,f,...)
  165.   local res = {}
  166.   for i = 1,n do
  167.     res[i] = f(i,...)
  168.   end
  169.   return res
  170. end
  171.  
  172. function Core.bind(f,v)
  173.   return function(...)
  174.     return f(v,...)
  175.   end
  176. end
  177.  
  178. function Core.bindn(f,...)
  179.   local args = {...}
  180.   return function(...)
  181.     return f(unpack(args),...)
  182.   end
  183. end
  184.  
  185. function Core.tap(val,f,...)
  186.   f(val,...)
  187.   return val
  188. end
  189.  
  190. return Core
  191. end)
  192. local Table=_W(function(_ENV, ...)
  193. local Table = {}
  194.  
  195. function Table.each(t,f,...)
  196.   for k,v in pairs(t) do
  197.     f(k,v,...)
  198.   end
  199. end
  200.  
  201. function Table.at(t,...)
  202.   local keys = {...}
  203.   local vals = {}
  204.   for _,v in pairs(keys) do
  205.     vals[#vals+1] = t[v]
  206.   end
  207.   return vals
  208. end
  209.  
  210. function Table.count(t,v)
  211.   if(v == nil) then return #t end
  212.   local i = 0
  213.   for k,vv in pairs(t) do if(_.isEqual(v,v)) then i = i + 1 end end
  214.   return i
  215. end
  216.  
  217. function Table.cycle(t,n)
  218.   n = n or 1
  219.   if n<=0 then return function() end end
  220.   local k, fk
  221.   local i = 0
  222.   while true do
  223.     return function()
  224.       k = k and next(t,k) or next(t)
  225.       fk = not fk and k or fk
  226.       if n then
  227.         i = (k==fk) and i+1 or i
  228.         if i > n then
  229.           return
  230.         end
  231.       end
  232.       return k, t[k]
  233.     end
  234.   end
  235. end
  236.  
  237. function Table.map(t,f)
  238.   local tt = {}
  239.   for k,v in pairs(t) do
  240.     tt[k] = f(k,v)
  241.   end
  242.   return tt
  243. end
  244.  
  245. function Table.reduce(t,f)
  246.   local m = ""
  247.   for _,v in pairs(t) do
  248.     m = f(m,v)
  249.   end
  250.   return m
  251. end
  252.  
  253. function Table.mapReduce(t,f)
  254.   local s = {}
  255.   local m = ""
  256.   for _,v in pairs(t) do
  257.     m = f(m,v)
  258.     s[#s+1] = m
  259.   end
  260.   return s
  261. end
  262.  
  263. function Table.detect(t,v)
  264.  
  265.   for k,vv in pairs(t) do
  266.     if(_.isCallable(v)) then
  267.       if(_.isEqual(vv,v(vv))) then return k end
  268.     else
  269.       if(_.isEqual(v,vv)) then return k end
  270.     end
  271.   end
  272.   return nil
  273. end
  274.  
  275. function Table.all(t,f)
  276.   for k,v in pairs(t) do
  277.     if(not f(k,v)) then return false end
  278.   end
  279.   return true
  280. end
  281.  
  282. function Table.include(t,v)
  283.   return Table.detect(t,v) ~= nil
  284. end
  285.  
  286. return Table
  287. end)
  288. local Array=_W(function(_ENV, ...)
  289. local Array = {}
  290.  
  291. function Array.toArray(...)
  292.   return {...}
  293. end
  294.  
  295. function Array.find(a,v,n)
  296.   for i = (n or 1),#a do
  297.     if(a[i] == v) then return i end
  298.   end
  299. end
  300.  
  301. function Array.reverse(a)
  302.   local aa = {}
  303.   for i = #a,1,-1 do
  304.     aa[#a-i+1] = a[i]
  305.   end
  306.   return aa
  307. end
  308.  
  309. function Array.selectWhile(a,f,...)
  310.   local selected = {}
  311.   for i = 1,#a do
  312.     if(f(i,a[i],...)) then selected[#selected+1] = a[i] else break end
  313.   end
  314.   return selected
  315. end
  316.  
  317. function Array.dropWhile(a,f,...)
  318.   local selected = {}
  319.   for i = 1,#a do
  320.     if(not f(i,a[i],...)) then select[#selected+1] = a[i] else break end
  321.   end
  322.   return selected
  323. end
  324.  
  325. function Array.indexOf(a,v)
  326.   for i,_v in pairs(a) do
  327.     if(v==_v) then return i end
  328.   end
  329. end
  330.  
  331. function Array.lastIndexOf(a,v)
  332.   local ind
  333.   for i,_v in pairs(a) do
  334.     if(v==_v) then ind = i end
  335.   end
  336.   return ind
  337. end
  338.  
  339. function Array.push(a,...)
  340.   for _,v in pairs({...}) do
  341.     a[#a+1] = v
  342.   end
  343.   return a
  344. end
  345.  
  346. function Array.pop(a)
  347.   local r = a[1]
  348.   table.remove(a,1)
  349.   return r
  350. end
  351.  
  352. function Array.unshift(a)
  353.   local r = a[#a]
  354.   table.remove(a,#a)
  355.   return r
  356. end
  357.  
  358. function Array.pull(a,...)
  359.   local l = {} for _,v in pairs({...}) do l[v] = true end
  360.   local aa = {}
  361.   for _,v in pairs(a) do
  362.     if(not l[v]) then aa[#aa+1] = v end
  363.   end
  364.   return aa
  365. end
  366.  
  367. function Array.removeRange(a,s,f)
  368.   for i = s,f do
  369.     table.remove(a,s)
  370.   end
  371.   return a
  372. end
  373.  
  374. function Array.slice(a,s,f)
  375.   local aa = {}
  376.   for i = s,f do
  377.     aa[#aa+1] = a[i]
  378.   end
  379.   return aa
  380. end
  381.  
  382. function Array.first(a,n)
  383.   local aa = {}
  384.   for i = 1,(n or 1) do
  385.     aa[i] = a[i]
  386.   end
  387.   return aa
  388. end
  389.  
  390. function Array.initial(a,n)
  391.   local aa = {}
  392.   for i = 1,#a-(n or 1) do
  393.     aa[i] = a[i]
  394.   end
  395.   return aa
  396. end
  397.  
  398. function Array.last(a,n)
  399.   local aa = {}
  400.   for i = #a-(n or 1),#a do
  401.     aa[#aa+1] = a[i]
  402.   end
  403.   return aa
  404. end
  405.  
  406. function Array.nth(a,i)
  407.   return a[i]
  408. end
  409.  
  410. function Array.difference(a,aa)
  411.   local aaa = {}
  412.   local l = {} for _,v in pairs(aa) do l[v] = true end
  413.   for _,v in pairs(a) do if(not l[v]) then aaa[#aaa+1] = v end end
  414.   return aaa
  415. end
  416.  
  417. function Array.union(...)
  418.   local a = {}
  419.   local l = {}
  420.   for _,_a in pairs({...}) do
  421.     for _,e in pairs(_a) do
  422.       if(not l[e]) then
  423.         a[#a+1] = e
  424.         l[e] = true
  425.       end
  426.     end
  427.   end
  428.   return
  429. end
  430.  
  431. function Array.unique(a)
  432.   local l = {}
  433.   local aa = {}
  434.   for _,v in pairs(a) do
  435.     if(not l[v]) then
  436.       aa[#aa+1] = v
  437.       l[v] = true
  438.     end
  439.   end
  440.   return aa
  441. end
  442.  
  443. function Array.isunique(a)
  444.   local l = {}
  445.   local aa = {}
  446.   for _,v in pairs(a) do
  447.     if(not l[v]) then
  448.       l[v] = true
  449.     else
  450.       return false
  451.     end
  452.   end
  453.   return true
  454. end
  455.  
  456. function Array.append(a,o)
  457.   local aa = a
  458.   for k,v in pairs(o) do
  459.     aa[#aa+o] = v
  460.   end
  461.   return aa
  462. end
  463.  
  464. function Array.range(s,f,i)
  465.   local i = i or 1
  466.   local a = {}
  467.   if(not f) then
  468.     for j = 0,s,i do
  469.       a[#a+1] = j
  470.     end
  471.   else
  472.     for j = s,f,i do
  473.       a[#a+1] = j
  474.     end
  475.   end
  476.   return a
  477. end
  478.  
  479. function Array.rep(v,n)
  480.   local a = {}
  481.   for i = 1,n do
  482.     a[#a+1] = v
  483.   end
  484.   return a
  485. end
  486.  
  487. function Array.concat(v,g)
  488.   local s = ""
  489.   local g = g or ""
  490.   for k,v in ipairs(v) do
  491.     s = s..g..v
  492.   end
  493.   return s
  494. end
  495.  
  496. function Array.split(v,p)
  497.   local p = p or " "
  498.   local t = {}
  499.   for m in v:gmatch("[^"..p.."]+") do
  500.     table.insert(t,m)
  501.   end
  502.   return t
  503. end
  504.  
  505. return Array
  506. end)
  507. local _ = {}
  508. _G._ = setmetatable({},{__index=_})
  509. local function merge(t,tt)
  510.   if(not t) then return end
  511.   for k,v in pairs(t) do
  512.     if(not tt[k]) then tt[k] = v end
  513.   end
  514. end
  515.  
  516. merge(Core,_)
  517. merge(Array,_)
  518. merge(Table,_)
  519. merge(Helper,_)
  520.  
  521. _._MODULES = {}
  522. _._MODULES.Core = true
  523. _._MODULES.Array = _.toBoolean(Array)
  524. _._MODULES.Table = _.toBoolean(Table)
  525. _._MODULES.Computercraft = _.toBoolean(CC)
  526. _._MODULES.Helper = _.toBoolean(Helper)
  527.  
  528. function _.new(v)
  529.   local i = {_value=v,_wrapped=true}
  530.   local function chainindex(t,k)
  531.     if(k == "value") then return function() return i._value end end
  532.     if(_.isCallable(_[k])) then
  533.       return function(...)
  534.         return _.new(_[k](i._value,...))
  535.       end
  536.     end
  537.   end
  538.   return setmetatable(i,{__index = chainindex})
  539. end
  540.  
  541. function _.chain(v)
  542.   return _.new(v)
  543. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement