{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-tom/demos/tom/copyAST.js"],"names":["wrapCurrentASTNode","copyAndWrapUnkownSubtree","copyArray","array","observer","map","elm","object","type","traceID","objectCopy","keys","Object","filter","key","value","Array","isArray","JSON","parse","stringify"],"mappings":";;;;;;AAASA,8B,sBAAAA,kB;;;;;;;;;;;uCAOeC,yD;;;;;;;;;;;;;;AALfC,8D;;;;;;;;;;;;;AAFAF,uE;;;;;;;;;AAET,qBAASE,SAAT,CAAmBC,KAAnB,EAA0BC,QAA1B,EAAoC;AAChC,uBAAOD,MAAME,GAAN,CAAUC,OAAOL,yBAAyBK,GAAzB,EAA8BF,QAA9B,CAAjB,CAAP;AACH;;AAED;AACe,qBAASH,wBAAT,CAAkCM,MAAlC,EAA0CH,QAA1C,EAAoD;AAC/D;AACA,oBAAIG,UAAUA,OAAOC,IAArB,EAA2B;AACvB;AACA,wBAAID,OAAOE,OAAX,EAAoB;AAChB,+BAAOF,OAAOE,OAAd;AACH;;AAEDT,uCAAmBO,MAAnB,EAA2BH,QAA3B;;AAEA,0BAAMM,aAAa,EAAnB;AACA,0BAAMC,OAAOC,OAAOD,IAAP,CAAYJ,MAAZ,EAAoBM,MAApB,CAA2BC,OAAOA,IAAI,CAAJ,MAAW,GAA7C,CAAb;AACA,yBAAK,MAAMA,GAAX,IAAkBH,IAAlB,EAAwB;AACpB,8BAAMI,QAAQR,OAAOO,GAAP,CAAd;;AAEA,4BAAIE,MAAMC,OAAN,CAAcF,KAAd,CAAJ,EAA0B;AACtBL,uCAAWI,GAAX,IAAkBZ,UAAUa,KAAV,EAAiBX,QAAjB,CAAlB;;AAEA;AACH;;AAED,4BAAI,CAACW,KAAL,EAAY;AACRL,uCAAWI,GAAX,IAAkBC,KAAlB;AACA;AACH;;AAED,gCAAQ,OAAOA,KAAf;AACI,iCAAK,UAAL;AACI;AACA;AACJ,iCAAK,QAAL;AACIL,2CAAWI,GAAX,IAAkBb,yBAAyBc,KAAzB,EAAgCX,QAAhC,CAAlB;AACA;AACJ;AACIM,2CAAWI,GAAX,IAAkBC,KAAlB;AARR;AAUH;;AAED,2BAAOL,UAAP;AACH,iBArCD,MAqCO;AACH,wBAAGM,MAAMC,OAAN,CAAcV,MAAd,CAAH,EAA0B;AACtB,+BAAOL,UAAUK,MAAV,EAAkBH,QAAlB,CAAP;AACH,qBAFD,MAEO,IAAI,CAACG,MAAL,EAAa;AAChB,+BAAOA,MAAP;AACH,qBAFM,MAEA;AACH;AACA,+BAAOW,KAAKC,KAAL,CAAWD,KAAKE,SAAL,CAAeb,MAAf,CAAX,CAAP;AACH;AACJ;AACJ;;+BAjDuBN,wB","file":"copyAST.js","sourcesContent":["import { wrapCurrentASTNode } from 'demos/tom/wrapAST.js';\n\nfunction copyArray(array, observer) {\n    return array.map(elm => copyAndWrapUnkownSubtree(elm, observer));\n}\n\n// Copies subtree of new ASTNodes. Every ASTNode it visits gets wrapped and a traceID assigned. \nexport default function copyAndWrapUnkownSubtree(object, observer) {\n    // simply check if the object is an astNode\n    if (object && object.type) {\n        // if already in AST return only a reference\n        if (object.traceID) {\n            return object.traceID;\n        }\n        \n        wrapCurrentASTNode(object, observer);\n        \n        const objectCopy = {};\n        const keys = Object.keys(object).filter(key => key[0] !== '_');\n        for (const key of keys) {\n            const value = object[key];\n\n            if (Array.isArray(value)) {\n                objectCopy[key] = copyArray(value, observer);\n\n                continue;\n            }\n\n            if (!value) {\n                objectCopy[key] = value;\n                continue;\n            }\n\n            switch (typeof value) {\n                case 'function':\n                    // ignore functions\n                    break;\n                case 'object':\n                    objectCopy[key] = copyAndWrapUnkownSubtree(value, observer);\n                    break;\n                default:\n                    objectCopy[key] = value;\n            }\n        }\n        \n        return objectCopy;\n    } else {\n        if(Array.isArray(object)) {\n            return copyArray(object, observer);\n        } else if (!object) {\n            return object;\n        } else {\n            // do a simple copy\n            return JSON.parse(JSON.stringify(object));\n        }\n    }\n}"]}