{"version":3,"sources":["../src/iterators/flexIterator.ts"],"names":["hasParentItem","obj","isPlainObject","FlexIterator","nodes","options","value","pick","transform","recursion","transformValue","parent","pickItemValue","sources","curSource","parents","parentValue","itemValue","SKIP","hasParent","v","canIterator","fValue"],"mappings":"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","file":"chunk-AYFP5A7J.mjs","sourcesContent":["import { isPlainObject } from \"../typecheck\"\nimport { canIterator } from \"./canIterator\"\nimport { SKIP } from \"../consts\"\n\nexport type FlexIteratorOptions<Value=any,Result=Value,Parent=any> = {\n    pick?:(item:Value | Parent)=>Value | Iterable<any> | {value:any,parent:Parent}\n    transform:(value:Value,parent?:Parent)=>Result\n    // 当true时如果transform也返回一个迭代对象时，递归遍历所有可迭代对象\n    recursion?:boolean\n}\n\nfunction hasParentItem(obj:object){\n    return isPlainObject(obj) && ('value' in obj) && ('parent' in obj)\n}\n/**\n * 可以迭代的对象\n * \n * const source = new FlexIterator([1,2,3,4,5])\n * for(let value of source){\n *  console.log(value)\n * }\n * Output: 1,2,3,4,5\n * \n * const source = new FlexIterator([1,2,3,4,5],{transform:(value)=>`S-${value}`})\n * for(let value of source){\n *  console.log(value)\n * }\n * Output: S-1,S-2,S-3,S-4,S-5\n * \n * const source = new FlexIterator([1,2,[3,4],[5,6,[7,8,[9,10]]]],{\n *  transform:(value)=>`S-${value}`\n *  recursion:true\n * })\n * for(let value of source){\n *  console.log(value) * \n * }\n * Output: S-1,S-2,S-3,S-4,S-5,S-6,S-7,S-8,S-9,S-10\n * \n * \n * \n * @types \n *  S: 源类型\n *  R: 返回值类型\n *  P: 当前节点的父节点类型，当\n * @param nodes \n * @param options \n */\nexport class FlexIterator<Value=any,Result=Value,Parent=any> {\n    options: FlexIteratorOptions<Value,Result,Parent>\n    constructor(private nodes: Iterable<Value | Iterable<any>>,options?:FlexIteratorOptions<Value,Result,Parent>) {\n        this.options = Object.assign({\n            recursion:false\n        },options)\n    }  \n    [Symbol.iterator](): Iterator<Result, any, undefined> {\n        let value : any\n        const {pick: pick,transform,recursion} = this.options\n        const transformValue = typeof(transform)=='function' ? (value:any,parent?:Parent)=>transform(value,parent) : (value:any,parent?:Parent)=>value\n        const pickItemValue = typeof(pick) == 'function' ? (value:Value | Parent)=>pick(value) : (value:any)=>value\n        let sources:Iterator<any>[] = [this.nodes[Symbol.iterator]()]  \n        let curSource = sources[sources.length-1] as Iterator<Result, any, undefined> \n        let parentValue:Value | Iterable<any> | undefined  = this.nodes\n        const parents:any[]=[this.nodes]\n        const self = this\n        return {\n            next() {                \n                value =  curSource.next()\n                if(value.done){\n                    sources.pop()\n                    parentValue = parents.pop()\n                    if(sources.length>0){\n                        curSource = sources[sources.length-1]    \n                        return this.next()          \n                    }else{\n                        return {done: true, value: undefined} \n                    }                    \n                }else{\n                    let itemValue  = pickItemValue(value.value)                                            \n                    // 处理SKIP跳过迭代项\n                    while(itemValue === SKIP){\n                        itemValue = curSource.next()\n                        if(itemValue.done){\n                            return {done: true, value: undefined} \n                        }else{\n                            itemValue  = pickItemValue(itemValue.value)   \n                        }                        \n                    } \n                    // 返回值指定了parent\n                    const hasParent = hasParentItem(itemValue)\n                    const v = hasParent ? itemValue.value : itemValue\n                    if(recursion && canIterator(v)){                        \n                        sources.push(v[Symbol.iterator]())\n                        curSource = sources[sources.length-1]    \n                        parents.push(hasParent ? itemValue.parent : v)\n                        return this.next() \n                    }else{     \n                        const fValue = transformValue(v,hasParent ? itemValue.parent : parents[parents.length-1] as any)\n                        if(fValue===SKIP){\n                            return this.next()\n                        }else{\n                            return {done:false,value:fValue}\n                        }\n                        \n                    }\n               }\n            },\n            return() {\n                return {done: true, value: undefined};\n            }\n        \n        }\n    }   \n}\n\nexport { SKIP } from \"../consts\"\n\n// const i1 = new FlexIterator([[1,2],[3,4],[5,6]],{\n//     pick:(value)=>value,\n//     transform:(value,parent)=>{\n//         console.log(\"parent=\",parent.join(\",\"))\n//         return `S-${value}`\n//     },\n//     recursion:false\n// })\n// for(let value of i1){\n//     console.log(value)\n// }\n\n// const i1 = new FlexIterator([1,2,3,4,5,6,7],{\n//     pick:(value)=>value % 2 ==0 ? SKIP : value,\n//     transform:(value,parent)=>{\n//         console.log(\"parent=\",parent)\n//         return `S-${value}`\n//     }\n// })\n// for(let value of i1){\n//     console.log(value)\n// }\n\n// const i1 = new FlexIterator([1,2,3,4,5],{transform:(value)=>`S-${value}`})\n// for(let value of i1){\n//     console.log(value)\n// }\n// // Output: S-1,S-2,S-3,S-4,S-5\n// console.log(\"---\")\n\n// const i2 = new FlexIterator([1,[2,3],[4,5]],{transform:(value)=>`S-${value}`})\n// for(let value of i2){\n//     console.log(value)\n// }\n\n// // Output: S-1,S-2,3,S-4,5\n// console.log(\"---\")\n// const i3 = new FlexIterator([1,[2,3],[4,5]],{transform:(value)=>`S-${value}`,recursion:true})\n// for(let value of i3){\n//     console.log(value)\n// }\n// // Output: S-1,S-2,S-3,S-4,S-5\n// console.log(\"---\")\n// const i4 = new FlexIterator([\"A\",\"AA\",\"AAA\",\"AAAA\",\"AAAAA\"],{\n//     pick:(value)=>String(value.length),\n//     transform:(value)=>`S-${value}`\n// })\n// for(let value of i4){\n//     console.log(value)\n// }\n// // Output: S-1,S-2,S-3,S-4,S-5\n// console.log(\"---\")\n// const i5 = new FlexIterator([1,[2,3],[4,5]],{\n//     pick:(value)=>value,\n//     transform:(value,parent)=>`S-${value} (parent=${parent})`,\n//     recursion:true\n// })\n// for(let value of i5){\n//     console.log(value)\n// }\n// // Output: \n// // S-1 (parent=undefined)\n// // S-2 (parent=2,3)\n// // S-3 (parent=2,3)\n// // S-4 (parent=4,5)\n// // S-5 (parent=4,5)\n// console.log(\"---\")\n\n// // Output: S-1,S-2,S-3,S-4,S-5\n// console.log(\"---\")\n\n// // Output: \n// // S-1 (parent=undefined)\n// // S-2 (parent=2,3)\n// // S-3 (parent=2,3)\n// // S-4 (parent=4,5)\n// // S-5 (parent=4,5)\n// console.log(\"---\")"]}