{"version":3,"sources":["../src/object/selfUpdate.ts"],"names":["Operates","typedParam","value","param","selfUpdateOperates","index","updateByOperate","updaters","isNothing","result","i","updater","location","update","splitIndex","hasOperate","operate","operateDefs","v","isPlainObject","key","selfUpdate","obj","path","orgValue","getByPath","newValue","setByPath"],"mappings":"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","file":"chunk-TK2QLKZC.mjs","sourcesContent":["import { getByPath } from \"./getByPath\" \nimport { setByPath } from \"./setByPath\"\nimport { isNothing } from \"../typecheck/isNothing\"\nimport { isPlainObject } from \"../typecheck/isPlainObject\"\n\nconst Operates = [\"+\",\"-\",\"*\",\"/\",\"%\",\">\",\"<\",\"&\",\"|\",\"~\",\"!\",\"^\"]\n\nfunction typedParam(value:any,param:any){\n    if(typeof value ==\"number\"){\n        return parseInt(param)\n    }else if(typeof value ==\"string\"){\n        return param\n    }else if(typeof value ==\"boolean\"){\n        return param !== \"false\"\n    }else{\n        return param\n    }\n}\n\n\n// 自更新操作符\nconst selfUpdateOperates={\n    string:{\n        \"+\":(value:any,index:number,param:any)=> value + param,// 追加\n        \">\":(value:any,index:number,param:any)=> value.substr(0,index)+param+value.substr(index),              // 在指定位置插入\n        \"-\":(value:any,index:number,param:any)=> value.substr(0,index)+param+value.substr(index+param.length)        // 删除index处的字符，然后插入param字符\n    },\n    boolean:{\n        \"&\":(value:any,index:number,param:any)=> value && param,\n        \"|\":(value:any,index:number,param:any)=> value || param,\n        \"!\":(value:any,index:number,param:any)=> !value\n    },\n    number:{\n        \"+\":(value:any,index:number,param:any)=>value+=param,\n        \"-\":(value:any,index:number,param:any)=>value-=param,\n        \"*\":(value:any,index:number,param:any)=>value*=param,\n        \"/\":(value:any,index:number,param:any)=>value/=param,\n        \"%\":(value:any,index:number,param:any)=>value+=param,\n        \">\":(value:any,index:number,param:any)=>value >> param,\n        \"<\":(value:any,index:number,param:any)=>{value << param},\n        \"&\":(value:any,index:number,param:any)=>value & param,\n        \"|\":(value:any,index:number,param:any)=>value | param,\n        \"~\":(value:any,index:number,param:any)=>~value,\n        \"^\":(value:any,index:number,param:any)=>value ^ param\n    }\n} as Record<string,Record<string,Function>>\n\n/**\n *\n * @param {*} value\n * @param updaters\n */\nfunction updateByOperate(value:any,updaters:string[]){\n\n    // 支持多个操作同时执行\n    if(!Array.isArray(updaters)) {\n        updaters= isNothing(updaters) ? [] : [updaters]\n    }\n    let result = value\n    for(let i=0;i<updaters.length;i++){\n        const updater = updaters[i]\n        // 更新器支持完整模式(例:xx=+1)和简写模式(例:+1)，\n\n        let location:any=null,update\n        if( updater.includes(\"=\")){\n            const splitIndex = updater.indexOf(\"=\")\n            location = updater.substring(0,splitIndex)\n            update = updater.substring(splitIndex+1)\n        }else{\n            update=updater\n        }\n\n        // 更新由 前置<操作符>+<操作参数组成>\n        let hasOperate = Operates.includes(update[0])\n        // 操作符\n        let operate = hasOperate ? update[0] : null\n        // 操作参数\n        let param = hasOperate ? update.slice(1) : update\n\n        if(typeof(value)==\"number\" || typeof(value)==\"string\" || typeof(value)==\"boolean\"){\n            // 每种数据类类型的操作定义在\n            let operateDefs =typeof(value) in selfUpdateOperates ? selfUpdateOperates[typeof(value)] : {}\n            // 将参数转换为原值一样的类型\n            param = typedParam(value,param)\n\n            // 有效操作符\n            if(operate && operate in operateDefs){\n                if(location){                       // location!=null,即使用了xx=+xx的形式\n                    // 如果&开头代表是后面的是值\n                    if(location.startsWith(\"&\")){\n                        location = location.substring(1)\n                        if(typeof(value)==\"number\"){\n                            location = parseInt(location)\n                        }else if(typeof(value)==\"boolean\") {\n                            location = location.toLowerCase()===\"false\"\n                        }\n                        if(location===value){\n                            result = operateDefs[operate](value,location,param)\n                            break\n                        }\n                    }else{// 不是以&开头代表是索引，仅仅当数据是字符串时有效\n                        location = parseInt(location)\n                        result = operateDefs[operate](value,location,param)\n                        break\n                    }\n                }else{      // location==null\n\n                    result = operateDefs[operate](value,location,param)\n                    break\n                }\n            }else{  // 无操作符\n                if(location){                       // location!=null,即使用了xx=+xx的形式\n                    // 如果&开头代表是后面的是值\n                    if(location.startsWith(\"&\")){\n                        location = typedParam(value,location.substr(1))\n                        if(location===value){\n                            result = param\n                            break\n                        }\n                    }else{\n                        result = param\n                        break\n                    }\n                }else{\n                    result = param\n                    break\n                }\n            }\n        }else if(Array.isArray(value)){\n            let index\n            if(location && location.startsWith(\"&\")){\n                index = value.findIndex(v=>String(v)===location.substr(1))\n            }else{\n                index = parseInt(location)\n            }\n            if(index>=0 && index<value.length){\n                value[index] = typedParam(value[index],updateByOperate(value[index],[update]))\n            }else if(!index && operate===\"+\"){   // 如果没有索引，则支持+追加操作\n                value.push(value.length>0 ? typedParam(value[0],param) : param)\n            }\n        }else if(isPlainObject(value)){\n            let key = location\n            if(key in value){\n                value[key] = typedParam(value[key],updateByOperate(value[key],[update]))\n            }\n        }else{\n\n        }\n\n    }\n    return result\n\n}\n\n// let data\n// function resetData(){\n//     data = {\n//         a:1,\n//         b:true,\n//         c:[1,2,3,4],\n//         d:[\"a\",\"b\",\"c\"],\n//         e:{\n//             a:1,b:2\n//         },\n//         f:{\n//             x:\"abc\",y:\"def\"\n//         },\n//         s:\"abc\"\n//     }\n// }\n\n// resetData()\n\n\n// function assertEqual(expr,expectValue,actualValue){\n//     if(JSON.stringify(expectValue) == JSON.stringify(actualValue)){\n//         console.log(expr,\"\\texpect =\",JSON.stringify(expectValue),\"\\t actual=\",JSON.stringify(actualValue))\n//     }else{\n//         console.error(expr,\"\\texpect =\",JSON.stringify(expectValue),\"\\t actual=\",JSON.stringify(actualValue))\n//     }\n//     resetData()\n// }\n\n// // 数字\n// selfUpdateBy(data,\"a\",\"+2\") ; assertEqual(\"+2\",3,data.a)\n// selfUpdateBy(data,\"a\",\"-2\") ; assertEqual(\"-2\",-1,data.a)\n// selfUpdateBy(data,\"a\",\"1=-2\"); assertEqual(\"1=-2\",-1,data.a)\n// selfUpdateBy(data,\"a\",\"&2=-2\"); assertEqual(\"&2=-2\",1,data.a)\n// selfUpdateBy(data,\"a\",[\"&2=0\",\"&1=9\"]); assertEqual('[\"&2=0\",\"&1=9\"]',9,data.a)\n// selfUpdateBy(data,\"a\",\"&1=100\"); assertEqual('&1=100',100,data.a)\n// selfUpdateBy(data,\"a\",\"-2\") ; assertEqual(\"-2\",-1,data.a)\n// selfUpdateBy(data,\"a\",\">1\") ; assertEqual(\">1\",0,data.a)\n\n\n\n// // 布尔\n// selfUpdateBy(data,\"b\",\"&false\"); assertEqual(\"&false\",false,data.b)\n// selfUpdateBy(data,\"b\",\"!\"); assertEqual(\"!\",false,data.b)\n\n// // 字符串\n// selfUpdateBy(data,\"s\",\"+xyz\"); assertEqual(\"+xyz\",\"abcxyz\",data.s)\n// selfUpdateBy(data,\"s\",\"1=>xyz\"); assertEqual(\"1=>xyz\",\"axyzbc\",data.s)\n// selfUpdateBy(data,\"s\",\"1=-xyz\"); assertEqual(\"1=-xyz\",\"axyz\",data.s)\n\n// // 数组\n// selfUpdateBy(data,\"c\",\"1=9\"); assertEqual(\"1=9\",[1,9,3,4],data.c)\n// selfUpdateBy(data,\"c\",\"1=+1\"); assertEqual(\"1=+1\",[1,3,3,4],data.c)\n// selfUpdateBy(data,\"c\",\"1=-1\"); assertEqual(\"1=-1\",[1,1,3,4],data.c)\n// selfUpdateBy(data,\"c\",\"&2=+1\"); assertEqual(\"&2=+1\",[1,3,3,4],data.c)  // 将值=2的项+1\n// selfUpdateBy(data,\"c\",\"1=>1\"); assertEqual(\"1=>1\",[1,1,3,4],data.c)\n\n// // 字符串数组\n// selfUpdateBy(data,\"d\",\"1=+1\"); assertEqual(\"1=>1\",[\"a\",\"b1\",\"c\"],data.d)\n// selfUpdateBy(data,\"d\",\"1=>0\"); assertEqual(\"1=>0\",[\"a\",\"0b\",\"c\"],data.d)\n// selfUpdateBy(data,\"d\",\"1=1=+xyz\"); assertEqual(\"1=1=+xyz\",[\"a\",\"bxyz\",\"c\"],data.d)\n\n// // 对象\n// selfUpdateBy(data,\"e\",\"a=+1\"); assertEqual(\"a=+1\",{a:2,b:2},data.e)\n// selfUpdateBy(data,\"f\",\"x=+000\"); assertEqual(\"x=+000\",{x:\"abc000\",y:\"def\"},data.f)\n// selfUpdateBy(data,\"f\",\"y=1=>000\"); assertEqual(\"y=1+000\",{x:\"abc\",y:\"d000ef\"},data.f)\n\n\nexport function selfUpdate(obj:object,path:string,operate:string | string[]){\n    let orgValue = getByPath(obj,path)\n    let newValue = updateByOperate(orgValue,Array.isArray(operate) ? operate : [operate])\n    setByPath(obj,path,newValue)\n}"]}