{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-tom/demos/tom/copy.js"],"names":["excludedProperties","copyArray","arr","copy","entry","push","copyASTParts","object","type","traceID","objectCopy","keys","Object","filter","key","includes","value","Array","isArray","JSON","parse","stringify"],"mappings":";;;;;;AAAQA,8B,sBAAAA,kB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAER,qBAASC,SAAT,CAAmBC,GAAnB,EAAwB;AACpB,sBAAMC,OAAO,EAAb;;AAEA,qBAAI,MAAMC,KAAV,IAAmBF,GAAnB,EAAwB;AACpBC,yBAAKE,IAAL,CAAUC,aAAaF,KAAb,CAAV;AACH;;AAED,uBAAOD,IAAP;AACH;;AAEc,qBAASG,YAAT,CAAsBC,MAAtB,EAA8B;AACzC;AACA,oBAAIA,UAAUA,OAAOC,IAArB,EAA2B;AACvB;AACA,wBAAID,OAAOE,OAAX,EAAoB;AAChB,+BAAOF,OAAOE,OAAd;AACH;;AAED,0BAAMC,aAAa,EAAnB;;AAEA,0BAAMC,OAAOC,OAAOD,IAAP,CAAYJ,MAAZ,EAAoBM,MAApB,CAA2BC,OAAO,CAACd,mBAAmBe,QAAnB,CAA4BD,GAA5B,CAAnC,CAAb;AACA,yBAAK,MAAMA,GAAX,IAAkBH,IAAlB,EAAwB;AACpB,8BAAMK,QAAQT,OAAOO,GAAP,CAAd;;AAEA,4BAAIG,MAAMC,OAAN,CAAcF,KAAd,CAAJ,EAA0B;AACtBN,uCAAWI,GAAX,IAAkBb,UAAUe,KAAV,CAAlB;;AAEA;AACH;;AAED,4BAAIA,UAAU,IAAd,EAAoB;AAChBN,uCAAWI,GAAX,IAAkBE,KAAlB;AACA;AACH;;AAED,gCAAQ,OAAOA,KAAf;AACI,iCAAK,UAAL;AACI;AACA;AACJ,iCAAK,QAAL;AACI;AACAN,2CAAWI,GAAX,IAAkBR,aAAaU,KAAb,CAAlB;AACA;AACJ;AACIN,2CAAWI,GAAX,IAAkBE,KAAlB;AATR;AAWH;;AAED,2BAAON,UAAP;AACH,iBArCD,MAqCO;AACH,wBAAGO,MAAMC,OAAN,CAAcX,MAAd,CAAH,EAA0B;AACtB,+BAAON,UAAUM,MAAV,CAAP;AACH,qBAFD,MAEO;AACH;AACA,+BAAOY,KAAKC,KAAL,CAAWD,KAAKE,SAAL,CAAed,MAAf,CAAX,CAAP;AACH;AACJ;AACJ;;+BA/CuBD,Y","file":"copy.js","sourcesContent":["import {excludedProperties} from 'demos/tom/wrapAST.js';\n\nfunction copyArray(arr) {\n    const copy = [];\n    \n    for(const entry of arr) {\n        copy.push(copyASTParts(entry));\n    }\n    \n    return copy;\n}\n\nexport default function copyASTParts(object) {\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        const objectCopy = {};\n\n        const keys = Object.keys(object).filter(key => !excludedProperties.includes(key));\n        for (const key of keys) {\n            const value = object[key];\n\n            if (Array.isArray(value)) {\n                objectCopy[key] = copyArray(value);\n\n                continue;\n            }\n\n            if (value === null) {\n                objectCopy[key] = value;\n                continue;\n            }\n\n            switch (typeof value) {\n                case 'function':\n                    // ignore functions\n                    break;\n                case 'object':\n                    // assume it is an astNode\n                    objectCopy[key] = copyASTParts(value);\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);\n        } else {\n            // do a simple copy\n            return JSON.parse(JSON.stringify(object));\n        }\n    }\n}"]}