{"version":3,"sources":["../src/object/objectIterator.ts"],"names":["objectIterator","obj","options","keys","onlyPrimitive","circularRef","assignObject","stack","parents","keyOrIndexs","count","curItem","parent","keyOrIndex","stepObjects","getNext","isCollection","hasCircularRef","CircularRefError","items","i","k","v","isPrimitive","done","value"],"mappings":";;;;AA8BO,SAASA,CAAAA,CAAeC,EAAeC,CAA6D,CAAA,CACnG,GAAI,CAAE,IAAA,CAAAC,CAAK,CAAA,aAAA,CAAAC,CAAc,CAAA,WAAA,CAAAC,CAAY,CAAIC,CAAAA,CAAAA,CAAa,CAClD,IAAK,CAAA,GACL,aAAc,CAAA,IAAA,CACd,WAAY,CAAA,OAChB,CAAEJ,CAAAA,CAAO,EAEHK,CAAc,CAAA,CAACN,CAAG,CAClBO,CAAAA,CAAAA,CAAgB,EAChBC,CAAAA,CAAAA,CAAyC,EAAC,CAC5CC,CAAe,CAAA,CAAA,CACfC,EACAC,CACAC,CAAAA,CAAAA,CAGAC,EACDT,CAAa,EAAA,UAAA,GAAYS,EAAc,IAAI,GAAA,CAAA,CAE9C,IAAMC,CAAAA,CAAU,IAAQ,CAIpB,GAHAJ,CAAUJ,CAAAA,CAAAA,CAAM,KAChBK,CAAAA,CAAAA,CAASJ,EAAQ,GAAI,EAAA,CACrBK,CAAaJ,CAAAA,CAAAA,CAAY,GAAI,EAAA,CAC1BO,IAAaL,CAAO,CAAA,CAAE,CACrB,IAAIM,CAAAA,CAAiB,MACrB,GAAGZ,CAAAA,EAAa,UAAW,CAAA,CACvB,GAAGS,CAAAA,CAAa,IAAIH,CAAO,CAAA,CAAE,CACzB,GAAGN,CAAAA,EAAa,QAAS,MAAM,IAAIa,CACnCD,CAAAA,CAAAA,CAAe,KACnB,CACAH,EAAa,GAAIH,CAAAA,CAAO,EAC5B,CACA,GAAG,CAACM,CAAe,CAAA,CACf,IAAME,CAAAA,CAAO,SAAaR,GAAAA,CAAAA,CAAW,CAAC,GAAGA,CAAAA,CAAQ,SAAS,CAAA,CAAI,OAAO,OAAQA,CAAAA,CAAO,CACpF,CAAA,IAAA,IAASS,CAAID,CAAAA,CAAAA,CAAM,OAAS,CAAGC,CAAAA,CAAAA,EAAK,EAAGA,CAAK,EAAA,CAAA,CACxC,GAAM,CAACC,CAAAA,CAAEC,CAAC,CAAA,CAAIH,CAAMC,CAAAA,CAAC,EACrBb,CAAM,CAAA,IAAA,CAAKe,CAAC,CACZd,CAAAA,CAAAA,CAAQ,KAAKG,CAAO,CAAA,CACpBF,CAAY,CAAA,IAAA,CAAKY,CAAC,EACtB,CACJ,CACJ,CAGA,OAFAX,CAGKN,EAAAA,CAAAA,CAAAA,EAAiB,CAACmB,GAAYZ,CAAAA,CAAO,CACpCD,EAAAA,CAAAA,EAAO,CACLP,EAAAA,CAAAA,EAAQA,EAAK,MAAO,CAAA,CAAA,EAAK,CAACA,CAAK,CAAA,QAAA,CAAS,OAAOU,CAAU,CAAC,CAEvDE,CAAAA,CAAAA,EAEJ,CAAA,CAAE,MAAMJ,CAAQ,CAAA,MAAA,CAAAC,EAAO,UAAAC,CAAAA,CAAW,CAC7C,CAEA,CAAA,OAAO,CACH,CAAC,MAAO,CAAA,QAAQ,GAAG,CACf,OAAO,CACH,IAAM,EAAA,CACF,IAAMW,CAAMjB,CAAAA,CAAAA,CAAM,MAAQ,EAAA,CAAA,CACpBkB,CAAQV,CAAAA,CAAAA,GACd,OAAO,CAAE,KAAAS,CAAK,CAAA,KAAA,CAAAC,CAAM,CACxB,CACJ,CACJ,CACJ,CAEJ","file":"chunk-SFH5ES6N.mjs","sourcesContent":["/**\n * \n * 返回一个用来对对象成员进行遍历的迭代器\n * \n * \n * \n */\n\nimport { CircularRefError } from \"../errors\";\nimport { isCollection } from \"../typecheck/isCollection\";\nimport { isPrimitive } from \"../typecheck/isPrimitive\";\nimport { Collection } from \"../types\";\nimport { assignObject } from \"./assignObject\";\n\nexport interface ObjectIteratorOptions{\n    keys?:string[]                              // 限定只能指定的健执行callback\n    // 仅遍历原始类型，如string,number,boolean,symbol,null,undefined等，\n    // 也就是说对于数组和对象只会遍历其成员，不会遍历数组和对象本身，不会执行callback\n    onlyPrimitive?:boolean     \n    // 是否检测循环引用  no-check:不进行检测, error: 触发错误,  skip: 跳过 \n    circularRef?: 'no-check' | 'error' | 'skip'       \n}\n\nexport interface ObjectIteratorValue { \n    value?:any\n    parent?:Collection| null,\n    keyOrIndex?:string | symbol | number | null\n    path: string[]\n}\n\nexport function objectIterator(obj:Collection,options?:ObjectIteratorOptions):Iterable<ObjectIteratorValue>{\n        let { keys,onlyPrimitive,circularRef } = assignObject({\n            keys:[], \n            onlyPrimitive:true,   \n            circularRef:'error'\n        },options) as Required<ObjectIteratorOptions>\n    \n        const stack:any[] = [obj]\n        const parents:any[] = []\n        const keyOrIndexs:(number | string | symbol)[]=[]\n        let count:number = 0\n        let curItem:any\n        let parent:any\n        let keyOrIndex:any  \n    \n        // 记录遍历走过的对象引用\n        let stepObjects:Set<any>\n        if(circularRef!='no-check') stepObjects = new Set() \n        \n        const getNext = ():any=>{\n            curItem = stack.pop() as any\n            parent = parents.pop()   \n            keyOrIndex = keyOrIndexs.pop() \n            if(isCollection(curItem)){\n                let hasCircularRef = false  // 存在循环引用\n                if(circularRef!='no-check'){\n                    if(stepObjects!.has(curItem)){   // 存在循环引用\n                        if(circularRef=='error') throw new CircularRefError()      \n                        hasCircularRef=true              \n                    }\n                    stepObjects!.add(curItem)\n                }        \n                if(!hasCircularRef){\n                    const items ='entries' in curItem ?  [...curItem.entries()] : Object.entries(curItem)                \n                    for (let i = items.length - 1; i >= 0; i--) {\n                        const [k,v] = items[i]\n                        stack.push(v); \n                        parents.push(curItem) \n                        keyOrIndexs.push(k)  \n                    } \n                }            \n            }  \n            count++      \n            // 如果不是原始类型，跳过        \n            if(\n                (onlyPrimitive && !isPrimitive(curItem))\n                ||count==1\n                || (keys && keys.length>0 && !keys.includes(String(keyOrIndex)))\n            ) {\n                return getNext()\n            }\n            return { value:curItem,parent,keyOrIndex } \n        }\n    \n        return {\n            [Symbol.iterator](){\n                return {\n                    next(){            \n                        const done= stack.length==0\n                        const value = getNext()\n                        return { done,value }\n                    }\n                }\n            }\n        } \n    \n    } \n    "]}