You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

moses.lua 21KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. local _ba='1.6.1'local aba,bba,cba,dba=next,type,select,pcall;local _ca,aca=setmetatable,getmetatable
  2. local bca,cca=table.insert,table.sort;local dca,_da=table.remove,table.concat
  3. local ada,bda,cda=math.randomseed,math.random,math.huge;local dda,__b,a_b=math.floor,math.max,math.min;local b_b=rawget
  4. local c_b=table.unpack or unpack;local d_b,_ab=pairs,ipairs;local aab=os.clock;local bab={}
  5. local function cab(dcb,_db)return dcb>_db end;local function dab(dcb,_db)return dcb<_db end
  6. local function _bb(dcb,_db,adb)return(dcb<_db)and _db or
  7. (dcb>adb and adb or dcb)end;local function abb(dcb,_db)return _db and true end
  8. local function bbb(dcb)return not dcb end
  9. local function cbb(dcb)local _db=0;for adb,bdb in d_b(dcb)do _db=_db+1 end;return _db end
  10. local function dbb(dcb,_db,adb,...)local bdb;local cdb=adb or bab.identity;for ddb,__c in d_b(dcb)do
  11. if not bdb then bdb=cdb(__c,...)else
  12. local a_c=cdb(__c,...)bdb=_db(bdb,a_c)and bdb or a_c end end;return bdb end
  13. local function _cb(dcb,_db,adb,bdb)for i=0,#dcb,_db do local cdb=bab.slice(dcb,i+1,i+_db)
  14. if#cdb>0 then while
  15. (#cdb<_db and bdb)do cdb[#cdb+1]=bdb end;adb(cdb)end end end
  16. local function acb(dcb,_db,adb,bdb)
  17. for i=0,#dcb,_db-1 do local cdb=bab.slice(dcb,i+1,i+_db)if
  18. #cdb>0 and i+1 <#dcb then while(#cdb<_db and bdb)do cdb[#cdb+1]=bdb end
  19. adb(cdb)end end end
  20. local function bcb(dcb,_db,adb)if _db==0 then adb(dcb)end
  21. for i=1,_db do dcb[_db],dcb[i]=dcb[i],dcb[_db]bcb(dcb,_db-
  22. 1,adb)dcb[_db],dcb[i]=dcb[i],dcb[_db]end end;local ccb=-1
  23. function bab.clear(dcb)for _db in d_b(dcb)do dcb[_db]=nil end;return dcb end
  24. function bab.each(dcb,_db,...)for adb,bdb in d_b(dcb)do _db(adb,bdb,...)end end
  25. function bab.eachi(dcb,_db,...)
  26. local adb=bab.sort(bab.select(bab.keys(dcb),function(bdb,cdb)return bab.isInteger(cdb)end))for bdb,cdb in _ab(adb)do _db(cdb,dcb[cdb],...)end end
  27. function bab.at(dcb,...)local _db={}for adb,bdb in _ab({...})do
  28. if bab.has(dcb,bdb)then _db[#_db+1]=dcb[bdb]end end;return _db end
  29. function bab.count(dcb,_db)if bab.isNil(_db)then return bab.size(dcb)end;local adb=0
  30. bab.each(dcb,function(bdb,cdb)if
  31. bab.isEqual(cdb,_db)then adb=adb+1 end end)return adb end
  32. function bab.countf(dcb,_db,...)return bab.count(bab.map(dcb,_db,...),true)end
  33. function bab.cycle(dcb,_db)_db=_db or 1;if _db<=0 then return bab.noop end;local adb,bdb;local cdb=0
  34. while true do
  35. return
  36. function()adb=adb and
  37. aba(dcb,adb)or aba(dcb)
  38. bdb=not bdb and adb or bdb;if _db then cdb=(adb==bdb)and cdb+1 or cdb
  39. if cdb>_db then return end end;return adb,dcb[adb]end end end
  40. function bab.map(dcb,_db,...)local adb={}
  41. for bdb,cdb in d_b(dcb)do local ddb,__c,a_c=bdb,_db(bdb,cdb,...)adb[a_c and __c or ddb]=
  42. a_c or __c end;return adb end;function bab.reduce(dcb,_db,adb)
  43. for bdb,cdb in d_b(dcb)do if adb==nil then adb=cdb else adb=_db(adb,cdb)end end;return adb end;function bab.reduceby(dcb,_db,adb,bdb,...)return
  44. bab.reduce(bab.select(dcb,bdb,...),_db,adb)end;function bab.reduceRight(dcb,_db,adb)return
  45. bab.reduce(bab.reverse(dcb),_db,adb)end
  46. function bab.mapReduce(dcb,_db,adb)
  47. local bdb={}for cdb,ddb in d_b(dcb)do bdb[cdb]=not adb and ddb or _db(adb,ddb)
  48. adb=bdb[cdb]end;return bdb end;function bab.mapReduceRight(dcb,_db,adb)
  49. return bab.mapReduce(bab.reverse(dcb),_db,adb)end
  50. function bab.include(dcb,_db)local adb=
  51. bab.isFunction(_db)and _db or bab.isEqual;for bdb,cdb in d_b(dcb)do if adb(cdb,_db)then
  52. return true end end;return false end
  53. function bab.detect(dcb,_db)
  54. local adb=bab.isFunction(_db)and _db or bab.isEqual;for bdb,cdb in d_b(dcb)do if adb(cdb,_db)then return bdb end end end
  55. function bab.where(dcb,_db)
  56. local adb=bab.select(dcb,function(bdb,cdb)
  57. for ddb in d_b(_db)do if cdb[ddb]~=_db[ddb]then return false end end;return true end)return#adb>0 and adb or nil end
  58. function bab.findWhere(dcb,_db)
  59. local adb=bab.detect(dcb,function(bdb)for cdb in d_b(_db)do
  60. if _db[cdb]~=bdb[cdb]then return false end end;return true end)return adb and dcb[adb]end
  61. function bab.select(dcb,_db,...)local adb={}for bdb,cdb in d_b(dcb)do
  62. if _db(bdb,cdb,...)then adb[#adb+1]=cdb end end;return adb end
  63. function bab.reject(dcb,_db,...)local adb=bab.map(dcb,_db,...)local bdb={}for cdb,ddb in d_b(adb)do if not ddb then
  64. bdb[#bdb+1]=dcb[cdb]end end;return bdb end
  65. function bab.all(dcb,_db,...)return( (#bab.select(bab.map(dcb,_db,...),abb))==
  66. cbb(dcb))end
  67. function bab.invoke(dcb,_db,...)local adb={...}
  68. return
  69. bab.map(dcb,function(bdb,cdb)
  70. if bab.isTable(cdb)then
  71. if bab.has(cdb,_db)then
  72. if
  73. bab.isCallable(cdb[_db])then return cdb[_db](cdb,c_b(adb))else return cdb[_db]end else
  74. if bab.isCallable(_db)then return _db(cdb,c_b(adb))end end elseif bab.isCallable(_db)then return _db(cdb,c_b(adb))end end)end
  75. function bab.pluck(dcb,_db)return
  76. bab.reject(bab.map(dcb,function(adb,bdb)return bdb[_db]end),bbb)end;function bab.max(dcb,_db,...)return dbb(dcb,cab,_db,...)end;function bab.min(dcb,_db,...)return
  77. dbb(dcb,dab,_db,...)end
  78. function bab.shuffle(dcb,_db)if _db then ada(_db)end
  79. local adb={}
  80. bab.each(dcb,function(bdb,cdb)local ddb=dda(bda()*bdb)+1;adb[bdb]=adb[ddb]
  81. adb[ddb]=cdb end)return adb end
  82. function bab.same(dcb,_db)
  83. return
  84. bab.all(dcb,function(adb,bdb)return bab.include(_db,bdb)end)and
  85. bab.all(_db,function(adb,bdb)return bab.include(dcb,bdb)end)end;function bab.sort(dcb,_db)cca(dcb,_db)return dcb end
  86. function bab.sortBy(dcb,_db,adb)
  87. local bdb=_db or bab.identity
  88. if bab.isString(_db)then bdb=function(ddb)return ddb[_db]end end;adb=adb or dab;local cdb={}
  89. bab.each(dcb,function(ddb,__c)
  90. cdb[#cdb+1]={value=__c,transform=bdb(__c)}end)
  91. cca(cdb,function(ddb,__c)return adb(ddb.transform,__c.transform)end)return bab.pluck(cdb,'value')end
  92. function bab.groupBy(dcb,_db,...)local adb={...}local bdb={}
  93. bab.each(dcb,function(cdb,ddb)local __c=_db(cdb,ddb,c_b(adb))
  94. if
  95. bdb[__c]then bdb[__c][#bdb[__c]+1]=ddb else bdb[__c]={ddb}end end)return bdb end
  96. function bab.countBy(dcb,_db,...)local adb={...}local bdb={}
  97. bab.each(dcb,function(cdb,ddb)local __c=_db(cdb,ddb,c_b(adb))bdb[__c]=(
  98. bdb[__c]or 0)+1 end)return bdb end
  99. function bab.size(...)local dcb={...}local _db=dcb[1]if bab.isTable(_db)then return cbb(dcb[1])else
  100. return cbb(dcb)end end;function bab.containsKeys(dcb,_db)
  101. for adb in d_b(_db)do if not dcb[adb]then return false end end;return true end
  102. function bab.sameKeys(dcb,_db)for adb in
  103. d_b(dcb)do if not _db[adb]then return false end end;for adb in
  104. d_b(_db)do if not dcb[adb]then return false end end
  105. return true end
  106. function bab.sample(dcb,_db,adb)_db=_db or 1;if _db<1 then return end;if _db==1 then if adb then ada(adb)end;return
  107. dcb[bda(1,#dcb)]end;return
  108. bab.slice(bab.shuffle(dcb,adb),1,_db)end
  109. function bab.sampleProb(dcb,_db,adb)if adb then ada(adb)end;return
  110. bab.select(dcb,function(bdb,cdb)return bda()<_db end)end;function bab.toArray(...)return{...}end
  111. function bab.find(dcb,_db,adb)for i=adb or 1,#dcb do if
  112. bab.isEqual(dcb[i],_db)then return i end end end
  113. function bab.reverse(dcb)local _db={}for i=#dcb,1,-1 do _db[#_db+1]=dcb[i]end;return _db end;function bab.fill(dcb,_db,adb,bdb)bdb=bdb or bab.size(dcb)
  114. for i=adb or 1,bdb do dcb[i]=_db end;return dcb end
  115. function bab.selectWhile(dcb,_db,...)
  116. local adb={}
  117. for bdb,cdb in _ab(dcb)do if _db(bdb,cdb,...)then adb[bdb]=cdb else break end end;return adb end
  118. function bab.dropWhile(dcb,_db,...)local adb
  119. for bdb,cdb in _ab(dcb)do if not _db(bdb,cdb,...)then adb=bdb;break end end;if bab.isNil(adb)then return{}end;return bab.rest(dcb,adb)end
  120. function bab.sortedIndex(dcb,_db,adb,bdb)local cdb=adb or dab;if bdb then bab.sort(dcb,cdb)end;for i=1,#dcb do if not
  121. cdb(dcb[i],_db)then return i end end
  122. return#dcb+1 end
  123. function bab.indexOf(dcb,_db)for k=1,#dcb do if dcb[k]==_db then return k end end end
  124. function bab.lastIndexOf(dcb,_db)local adb=bab.indexOf(bab.reverse(dcb),_db)if adb then return
  125. #dcb-adb+1 end end;function bab.findIndex(dcb,_db,...)
  126. for k=1,#dcb do if _db(k,dcb[k],...)then return k end end end
  127. function bab.findLastIndex(dcb,_db,...)
  128. local adb=bab.findIndex(bab.reverse(dcb),_db,...)if adb then return#dcb-adb+1 end end;function bab.addTop(dcb,...)
  129. bab.each({...},function(_db,adb)bca(dcb,1,adb)end)return dcb end;function bab.push(dcb,...)bab.each({...},function(_db,adb)
  130. dcb[#dcb+1]=adb end)
  131. return dcb end
  132. function bab.pop(dcb,_db)
  133. _db=a_b(_db or 1,#dcb)local adb={}
  134. for i=1,_db do local bdb=dcb[1]adb[#adb+1]=bdb;dca(dcb,1)end;return c_b(adb)end
  135. function bab.unshift(dcb,_db)_db=a_b(_db or 1,#dcb)local adb={}for i=1,_db do local bdb=dcb[#dcb]
  136. adb[#adb+1]=bdb;dca(dcb)end;return c_b(adb)end
  137. function bab.pull(dcb,...)
  138. for _db,adb in _ab({...})do for i=#dcb,1,-1 do
  139. if bab.isEqual(dcb[i],adb)then dca(dcb,i)end end end;return dcb end
  140. function bab.removeRange(dcb,_db,adb)local bdb=bab.clone(dcb)local cdb,ddb=(aba(bdb)),#bdb
  141. if ddb<1 then return bdb end;_db=_bb(_db or cdb,cdb,ddb)
  142. adb=_bb(adb or ddb,cdb,ddb)if adb<_db then return bdb end;local __c=adb-_db+1;local a_c=_db;while __c>0 do
  143. dca(bdb,a_c)__c=__c-1 end;return bdb end
  144. function bab.chunk(dcb,_db,...)if not bab.isArray(dcb)then return dcb end;local adb,bdb,cdb={},0
  145. local ddb=bab.map(dcb,_db,...)
  146. bab.each(ddb,function(__c,a_c)cdb=(cdb==nil)and a_c or cdb;bdb=(
  147. (a_c~=cdb)and(bdb+1)or bdb)
  148. if not adb[bdb]then adb[bdb]={dcb[__c]}else adb[bdb][
  149. #adb[bdb]+1]=dcb[__c]end;cdb=a_c end)return adb end
  150. function bab.slice(dcb,_db,adb)return
  151. bab.select(dcb,function(bdb)return
  152. (bdb>= (_db or aba(dcb))and bdb<= (adb or#dcb))end)end;function bab.first(dcb,_db)local adb=_db or 1
  153. return bab.slice(dcb,1,a_b(adb,#dcb))end
  154. function bab.initial(dcb,_db)
  155. if _db and _db<0 then return end;return
  156. bab.slice(dcb,1,_db and#dcb- (a_b(_db,#dcb))or#dcb-1)end;function bab.last(dcb,_db)if _db and _db<=0 then return end
  157. return bab.slice(dcb,_db and
  158. #dcb-a_b(_db-1,#dcb-1)or 2,#dcb)end;function bab.rest(dcb,_db)if _db and
  159. _db>#dcb then return{}end
  160. return bab.slice(dcb,
  161. _db and __b(1,a_b(_db,#dcb))or 1,#dcb)end;function bab.nth(dcb,_db)
  162. return dcb[_db]end;function bab.compact(dcb)return
  163. bab.reject(dcb,function(_db,adb)return not adb end)end
  164. function bab.flatten(dcb,_db)local adb=
  165. _db or false;local bdb;local cdb={}
  166. for ddb,__c in d_b(dcb)do
  167. if bab.isTable(__c)then bdb=adb and __c or
  168. bab.flatten(__c)
  169. bab.each(bdb,function(a_c,b_c)cdb[#cdb+1]=b_c end)else cdb[#cdb+1]=__c end end;return cdb end
  170. function bab.difference(dcb,_db)if not _db then return bab.clone(dcb)end;return
  171. bab.select(dcb,function(adb,bdb)return not
  172. bab.include(_db,bdb)end)end
  173. function bab.union(...)return bab.uniq(bab.flatten({...}))end
  174. function bab.intersection(dcb,...)local _db={...}local adb={}
  175. for bdb,cdb in _ab(dcb)do if
  176. bab.all(_db,function(ddb,__c)return bab.include(__c,cdb)end)then bca(adb,cdb)end end;return adb end
  177. function bab.symmetricDifference(dcb,_db)return
  178. bab.difference(bab.union(dcb,_db),bab.intersection(dcb,_db))end
  179. function bab.unique(dcb)local _db={}for i=1,#dcb do if not bab.find(_db,dcb[i])then
  180. _db[#_db+1]=dcb[i]end end;return _db end
  181. function bab.isunique(dcb)return bab.isEqual(dcb,bab.unique(dcb))end
  182. function bab.zip(...)local dcb={...}
  183. local _db=bab.max(bab.map(dcb,function(bdb,cdb)return#cdb end))local adb={}for i=1,_db do adb[i]=bab.pluck(dcb,i)end;return adb end
  184. function bab.append(dcb,_db)local adb={}for bdb,cdb in _ab(dcb)do adb[bdb]=cdb end;for bdb,cdb in _ab(_db)do
  185. adb[#adb+1]=cdb end;return adb end
  186. function bab.interleave(...)return bab.flatten(bab.zip(...))end;function bab.interpose(dcb,_db)return
  187. bab.flatten(bab.zip(_db,bab.rep(dcb,#_db-1)))end
  188. function bab.range(...)
  189. local dcb={...}local _db,adb,bdb
  190. if#dcb==0 then return{}elseif#dcb==1 then adb,_db,bdb=dcb[1],0,1 elseif#dcb==2 then
  191. _db,adb,bdb=dcb[1],dcb[2],1 elseif#dcb==3 then _db,adb,bdb=dcb[1],dcb[2],dcb[3]end;if(bdb and bdb==0)then return{}end;local cdb={}
  192. local ddb=__b(dda((adb-_db)/bdb),0)for i=1,ddb do cdb[#cdb+1]=_db+bdb*i end;if#cdb>0 then
  193. bca(cdb,1,_db)end;return cdb end
  194. function bab.rep(dcb,_db)local adb={}for i=1,_db do adb[#adb+1]=dcb end;return adb end;function bab.partition(dcb,_db,adb)if _db<=0 then return end
  195. return coroutine.wrap(function()
  196. _cb(dcb,_db or 1,coroutine.yield,adb)end)end;function bab.sliding(dcb,_db,adb)if
  197. _db<=1 then return end
  198. return coroutine.wrap(function()
  199. acb(dcb,_db or 2,coroutine.yield,adb)end)end
  200. function bab.permutation(dcb)return
  201. coroutine.wrap(function()bcb(dcb,
  202. #dcb,coroutine.yield)end)end;function bab.invert(dcb)local _db={}
  203. bab.each(dcb,function(adb,bdb)_db[bdb]=adb end)return _db end
  204. function bab.concat(dcb,_db,adb,bdb)
  205. local cdb=bab.map(dcb,function(ddb,__c)return
  206. tostring(__c)end)return _da(cdb,_db,adb or 1,bdb or#dcb)end;function bab.noop()return end;function bab.identity(dcb)return dcb end;function bab.constant(dcb)return
  207. function()return dcb end end
  208. function bab.memoize(dcb,_db)
  209. local adb=_ca({},{__mode='kv'})local bdb=_db or bab.identity;return
  210. function(...)local cdb=bdb(...)local ddb=adb[cdb]if not ddb then
  211. adb[cdb]=dcb(...)end;return adb[cdb]end end;function bab.once(dcb)local _db=0;local adb={}
  212. return function(...)_db=_db+1;if _db<=1 then adb={...}end
  213. return dcb(c_b(adb))end end
  214. function bab.before(dcb,_db)
  215. local adb=0;local bdb={}return
  216. function(...)adb=adb+1;if adb<=_db then bdb={...}end;return dcb(c_b(bdb))end end
  217. function bab.after(dcb,_db)local adb,bdb=_db,0;return
  218. function(...)bdb=bdb+1;if bdb>=adb then return dcb(...)end end end
  219. function bab.compose(...)local dcb=bab.reverse{...}
  220. return function(...)local _db,adb=true
  221. for bdb,cdb in _ab(dcb)do if _db then _db=false
  222. adb=cdb(...)else adb=cdb(adb)end end;return adb end end
  223. function bab.pipe(dcb,...)return bab.compose(...)(dcb)end
  224. function bab.complement(dcb)return function(...)return not dcb(...)end end;function bab.juxtapose(dcb,...)local _db={}
  225. bab.each({...},function(adb,bdb)_db[#_db+1]=bdb(dcb)end)return c_b(_db)end
  226. function bab.wrap(dcb,_db)return function(...)return
  227. _db(dcb,...)end end
  228. function bab.times(dcb,_db,...)local adb={}for i=1,dcb do adb[i]=_db(i,...)end;return adb end
  229. function bab.bind(dcb,_db)return function(...)return dcb(_db,...)end end;function bab.bind2(dcb,_db)
  230. return function(adb,...)return dcb(adb,_db,...)end end;function bab.bindn(dcb,...)local _db={...}
  231. return function(...)return
  232. dcb(c_b(bab.append(_db,{...})))end end
  233. function bab.bindAll(dcb,...)local _db={...}
  234. for adb,bdb in
  235. _ab(_db)do local cdb=dcb[bdb]if cdb then dcb[bdb]=bab.bind(cdb,dcb)end end;return dcb end
  236. function bab.uniqueId(dcb,...)ccb=ccb+1
  237. if dcb then if bab.isString(dcb)then return dcb:format(ccb)elseif
  238. bab.isFunction(dcb)then return dcb(ccb,...)end end;return ccb end
  239. function bab.iterator(dcb,_db)return function()_db=dcb(_db)return _db end end
  240. function bab.array(...)local dcb={}for _db in...do dcb[#dcb+1]=_db end;return dcb end;function bab.flip(dcb)return
  241. function(...)return dcb(c_b(bab.reverse({...})))end end;function bab.over(...)
  242. local dcb={...}
  243. return function(...)local _db={}for adb,bdb in _ab(dcb)do _db[#_db+1]=bdb(...)end
  244. return _db end end;function bab.overEvery(...)
  245. local dcb=bab.over(...)
  246. return function(...)return
  247. bab.reduce(dcb(...),function(_db,adb)return _db and adb end)end end;function bab.overSome(...)
  248. local dcb=bab.over(...)
  249. return function(...)return
  250. bab.reduce(dcb(...),function(_db,adb)return _db or adb end)end end
  251. function bab.overArgs(dcb,...)
  252. local _db={...}return
  253. function(...)local adb={...}for i=1,#_db do local bdb=_db[i]
  254. if adb[i]then adb[i]=bdb(adb[i])end end;return dcb(c_b(adb))end end
  255. function bab.partial(dcb,...)local _db={...}
  256. return
  257. function(...)local adb={...}local bdb={}for cdb,ddb in _ab(_db)do bdb[cdb]=
  258. (ddb=='_')and bab.pop(adb)or ddb end;return
  259. dcb(c_b(bab.append(bdb,adb)))end end
  260. function bab.partialRight(dcb,...)local _db={...}
  261. return
  262. function(...)local adb={...}local bdb={}
  263. for k=1,#_db do bdb[k]=
  264. (_db[k]=='_')and bab.pop(adb)or _db[k]end;return dcb(c_b(bab.append(adb,bdb)))end end
  265. function bab.curry(dcb,_db)_db=_db or 2;local adb={}
  266. local function bdb(cdb)if _db==1 then return dcb(cdb)end;if cdb~=nil then
  267. adb[#adb+1]=cdb end;if#adb<_db then return bdb else local ddb={dcb(c_b(adb))}adb={}return
  268. c_b(ddb)end end;return bdb end
  269. function bab.time(dcb,...)local _db=aab()local adb={dcb(...)}return aab()-_db,c_b(adb)end;function bab.keys(dcb)local _db={}
  270. bab.each(dcb,function(adb)_db[#_db+1]=adb end)return _db end;function bab.values(dcb)local _db={}
  271. bab.each(dcb,function(adb,bdb)_db[
  272. #_db+1]=bdb end)return _db end;function bab.kvpairs(dcb)local _db={}
  273. bab.each(dcb,function(adb,bdb)_db[
  274. #_db+1]={adb,bdb}end)return _db end
  275. function bab.toObj(dcb)local _db={}for adb,bdb in
  276. _ab(dcb)do _db[bdb[1]]=bdb[2]end;return _db end
  277. function bab.property(dcb)return function(_db)return _db[dcb]end end
  278. function bab.propertyOf(dcb)return function(_db)return dcb[_db]end end;function bab.toBoolean(dcb)return not not dcb end
  279. function bab.extend(dcb,...)local _db={...}
  280. bab.each(_db,function(adb,bdb)if
  281. bab.isTable(bdb)then
  282. bab.each(bdb,function(cdb,ddb)dcb[cdb]=ddb end)end end)return dcb end
  283. function bab.functions(dcb,_db)dcb=dcb or bab;local adb={}
  284. bab.each(dcb,function(cdb,ddb)if bab.isFunction(ddb)then
  285. adb[#adb+1]=cdb end end)if not _db then return bab.sort(adb)end;local bdb=aca(dcb)
  286. if
  287. bdb and bdb.__index then local cdb=bab.functions(bdb.__index)bab.each(cdb,function(ddb,__c)
  288. adb[#adb+1]=__c end)end;return bab.sort(adb)end
  289. function bab.clone(dcb,_db)if not bab.isTable(dcb)then return dcb end;local adb={}
  290. bab.each(dcb,function(bdb,cdb)if
  291. bab.isTable(cdb)then
  292. if not _db then adb[bdb]=bab.clone(cdb,_db)else adb[bdb]=cdb end else adb[bdb]=cdb end end)return adb end;function bab.tap(dcb,_db,...)_db(dcb,...)return dcb end;function bab.has(dcb,_db)return
  293. dcb[_db]~=nil end
  294. function bab.pick(dcb,...)local _db=bab.flatten{...}
  295. local adb={}
  296. bab.each(_db,function(bdb,cdb)
  297. if not bab.isNil(dcb[cdb])then adb[cdb]=dcb[cdb]end end)return adb end
  298. function bab.omit(dcb,...)local _db=bab.flatten{...}local adb={}
  299. bab.each(dcb,function(bdb,cdb)if
  300. not bab.include(_db,bdb)then adb[bdb]=cdb end end)return adb end;function bab.template(dcb,_db)
  301. bab.each(_db or{},function(adb,bdb)if not dcb[adb]then dcb[adb]=bdb end end)return dcb end
  302. function bab.isEqual(dcb,_db,adb)
  303. local bdb=bba(dcb)local cdb=bba(_db)if bdb~=cdb then return false end
  304. if bdb~='table'then return(dcb==_db)end;local ddb=aca(dcb)local __c=aca(_db)if adb then
  305. if
  306. (ddb or __c)and(ddb.__eq or __c.__eq)then return
  307. ddb.__eq(dcb,_db)or __c.__eq(_db,dcb)or(dcb==_db)end end;if bab.size(dcb)~=
  308. bab.size(_db)then return false end;for a_c,b_c in d_b(dcb)do local c_c=_db[a_c]
  309. if
  310. bab.isNil(c_c)or not bab.isEqual(b_c,c_c,adb)then return false end end
  311. for a_c,b_c in d_b(_db)do
  312. local c_c=dcb[a_c]if bab.isNil(c_c)then return false end end;return true end
  313. function bab.result(dcb,_db,...)
  314. if dcb[_db]then if bab.isCallable(dcb[_db])then return dcb[_db](dcb,...)else return
  315. dcb[_db]end end;if bab.isCallable(_db)then return _db(dcb,...)end end;function bab.isTable(dcb)return bba(dcb)=='table'end
  316. function bab.isCallable(dcb)return
  317. (
  318. bab.isFunction(dcb)or
  319. (bab.isTable(dcb)and aca(dcb)and aca(dcb).__call~=nil)or false)end
  320. function bab.isArray(dcb)if not bab.isTable(dcb)then return false end;local _db=0
  321. for adb in
  322. d_b(dcb)do _db=_db+1;if bab.isNil(dcb[_db])then return false end end;return true end
  323. function bab.isIterable(dcb)return bab.toBoolean((dba(d_b,dcb)))end
  324. function bab.isEmpty(dcb)if bab.isNil(dcb)then return true end;if bab.isString(dcb)then
  325. return#dcb==0 end
  326. if bab.isTable(dcb)then return aba(dcb)==nil end;return true end;function bab.isString(dcb)return bba(dcb)=='string'end;function bab.isFunction(dcb)return
  327. bba(dcb)=='function'end;function bab.isNil(dcb)
  328. return dcb==nil end
  329. function bab.isNumber(dcb)return bba(dcb)=='number'end
  330. function bab.isNaN(dcb)return bab.isNumber(dcb)and dcb~=dcb end
  331. function bab.isFinite(dcb)if not bab.isNumber(dcb)then return false end;return
  332. dcb>-cda and dcb<cda end;function bab.isBoolean(dcb)return bba(dcb)=='boolean'end
  333. function bab.isInteger(dcb)return
  334. bab.isNumber(dcb)and dda(dcb)==dcb end
  335. do bab.forEach=bab.each;bab.forEachi=bab.eachi;bab.loop=bab.cycle
  336. bab.collect=bab.map;bab.inject=bab.reduce;bab.foldl=bab.reduce
  337. bab.injectr=bab.reduceRight;bab.foldr=bab.reduceRight;bab.mapr=bab.mapReduce
  338. bab.maprr=bab.mapReduceRight;bab.any=bab.include;bab.some=bab.include;bab.contains=bab.include
  339. bab.filter=bab.select;bab.discard=bab.reject;bab.every=bab.all
  340. bab.takeWhile=bab.selectWhile;bab.rejectWhile=bab.dropWhile;bab.shift=bab.pop;bab.remove=bab.pull
  341. bab.rmRange=bab.removeRange;bab.chop=bab.removeRange;bab.sub=bab.slice;bab.head=bab.first
  342. bab.take=bab.first;bab.tail=bab.rest;bab.skip=bab.last;bab.without=bab.difference
  343. bab.diff=bab.difference;bab.symdiff=bab.symmetricDifference;bab.xor=bab.symmetricDifference
  344. bab.uniq=bab.unique;bab.isuniq=bab.isunique;bab.transpose=bab.zip;bab.part=bab.partition
  345. bab.perm=bab.permutation;bab.mirror=bab.invert;bab.join=bab.concat;bab.cache=bab.memoize
  346. bab.juxt=bab.juxtapose;bab.uid=bab.uniqueId;bab.iter=bab.iterator;bab.methods=bab.functions
  347. bab.choose=bab.pick;bab.drop=bab.omit;bab.defaults=bab.template;bab.compare=bab.isEqual end
  348. do local dcb={}local _db={}_db.__index=dcb;local function adb(bdb)local cdb={_value=bdb,_wrapped=true}
  349. return _ca(cdb,_db)end
  350. _ca(_db,{__call=function(bdb,cdb)return adb(cdb)end,__index=function(bdb,cdb,...)return
  351. dcb[cdb]end})function _db.chain(bdb)return adb(bdb)end
  352. function _db:value()return self._value end;dcb.chain,dcb.value=_db.chain,_db.value
  353. for bdb,cdb in d_b(bab)do
  354. dcb[bdb]=function(ddb,...)local __c=bab.isTable(ddb)and
  355. ddb._wrapped or false
  356. if __c then
  357. local a_c=ddb._value;local b_c=cdb(a_c,...)return adb(b_c)else return cdb(ddb,...)end end end
  358. dcb.import=function(bdb,cdb)bdb=bdb or _ENV or _G;local ddb=bab.functions()
  359. bab.each(ddb,function(__c,a_c)
  360. if
  361. b_b(bdb,a_c)then if not cdb then bdb[a_c]=bab[a_c]end else bdb[a_c]=bab[a_c]end end)return bdb end;_db._VERSION='Moses v'.._ba
  362. _db._URL='http://github.com/Yonaba/Moses'
  363. _db._LICENSE='MIT <http://raw.githubusercontent.com/Yonaba/Moses/master/LICENSE>'_db._DESCRIPTION='utility-belt library for functional programming in Lua'return
  364. _db end