function jclone(obj){ return Array.isArray(obj) ? $.extend(true,[],obj) : $.extend(true,{},obj) } function jx(obj){ return JSON.parse(JSON.stringify(obj)) } function jx_r(name,val){ if(typeof(val) == "function"){ // clog("FN!",name,val) return val.name + "()" } return val } function jx_fn(obj){ return JSON.parse(JSON.stringify(obj,jx_r)) } function flat_proto(arr,d=1){ var k,v,o,o2 var cnt = 0 o = [] o2 = [] o2 = arr while (d>0){ // clog(d) o = o2 o2 = [] for (v of o){ o2 = o2.concat(v) } d -= 1 } return o2 } function alog(arr,d=1){ clog(...flat_proto(arr,d)) } function spread(itr) { return [...itr] } function nop(){} function jx_cr(name,val){ if(typeof(val) == "function"){ // clog("FN!",name,val) return val.name + "()" } clog("JX-CR",this,arguments) return val } function dec_walker(argument) { var dw = {N:"dw",cnt:0,omap:new Map(),path:[]} // _obj var uobj return function (name,val){ dw.path.push(name) var ret = val dw.cnt += 1 if(typeof(val) == "function"){ // clog("FN!",name,val) ret = val.name + "()" // return val.name + "()" } if (typeof(ret) != "object" || !ret){ dw.path.pop() } if (typeof(ret) == "object" && ret){ uobj = dw.omap.get(ret) dw.omap.setD(ret,dw.path + "") if (uobj){ return uobj + "~" dw.path.pop() } } // clog("JX-DW",name,typeof(val),"\n",this,dw,arguments) return ret } } function jx_rec_fn(obj){ // return JSON.parse(JSON.stringify(obj,jx_cr)) // return JSON.stringify(obj,jx_cr) return JSON.stringify(obj,dec_walker()) } function jx_rec_fn_clone(obj){ return JSON.parse(jx_rec_fn(obj,jx_cr)) } window.jx_rec_fn = jx_rec_fn window.jx_rec_fn_clone = jx_rec_fn_clone window.nop = nop window.fn_utils = {single_fns:{},} window.zlog = nop window.spread = spread window.keys = Object.keys window.entries = Object.entries window.items = Object.entries window.alog = alog window.flat_proto = flat_proto window.dev_glob = {} window.jc_u = "UTILS" window.jc = jclone window.jx = jx window.jx_fn = jx_rec_fn_clone window.jx_fn_orig = jx_fn window.jclone = jclone