{"version":3,"sources":["../src/func/memorize.ts"],"names":["memorize","fn","options","result","preHash","timestamp","getHash","args","isInvalid","hash","isAsyncFunction"],"mappings":";;;;AAOQ,SAASA,CAASC,CAAAA,CAAAA,CAAYC,CAA+E,CAAA,CAAC,IAAK,CAAA,KAAA,CAAM,OAAQ,CAAA,CAAC,CAAG,CAAA,CACzI,IAAIC,CAAAA,CACAC,CACAC,CAAAA,CAAAA,CAAoB,CACxB,CAAA,GAAGH,CAAQ,CAAA,IAAA,EAAQ,KAAQ,CAAA,OAAOD,CAElC,CAAA,IAAMK,CAAQ,CAAA,SAAkBC,CAAY,CAAA,CACxC,OAAOL,CAAAA,CAAQ,IAAQ,EAAA,QAAA,CAAW,MAAOK,CAAAA,CAAAA,CAAK,MAAM,CAAA,CAAK,OAAOL,CAAAA,CAAQ,IAAQ,EAAA,UAAA,CAAaA,CAAQ,CAAA,IAAA,CAAK,IAAK,CAAA,IAAA,CAAKK,CAAI,CAAA,CAAI,MAChI,CAAA,CAEMC,CAAaC,CAAAA,CAAAA,EAAqCN,CAAS,GAAA,MAAA,EAAcM,CAAM,EAAA,IAAA,EAAaA,CAAML,EAAAA,CAAAA,EAAaF,CAAQ,CAAA,OAAA,EAAWA,CAAQ,CAAA,OAAA,CAAQ,CAAKG,EAAAA,CAAAA,CAAU,GAAM,IAAK,CAAA,GAAA,EAAQA,CAAAA,CAAAA,CAAYH,CAAQ,CAAA,OAAA,CAE9M,OAAGQ,CAAAA,CAAgBT,CAAE,CAAA,CACV,eAA2BM,GAAAA,CAAAA,CAAW,CACzC,IAAIE,CAAOH,CAAAA,CAAAA,CAAQ,IAAK,CAAA,IAAA,CAAKC,CAAI,CAAA,CACjC,OAAGC,CAAAA,CAAUC,CAAI,CAAA,GACbN,CAAQ,CAAA,MAAMF,CAAG,CAAA,KAAA,CAAM,IAAKM,CAAAA,CAAI,CAChCF,CAAAA,CAAAA,CAAY,KAAK,GAAI,EAAA,CACrBD,CAAUK,CAAAA,CAAAA,CAAAA,CAEPN,CACX,CAAA,CAEO,SAAqBI,GAAAA,CAAAA,CAAW,CACnC,IAAIE,CAAOH,CAAAA,CAAAA,CAAQ,IAAK,CAAA,IAAA,CAAKC,CAAI,CAAA,CACjC,OAAGC,CAAAA,CAAUC,CAAI,CAAA,GACbN,CAASF,CAAAA,CAAAA,CAAG,KAAM,CAAA,IAAA,CAAKM,CAAI,CAAA,CAC3BF,CAAY,CAAA,IAAA,CAAK,GAAI,EAAA,CACrBD,CAAUK,CAAAA,CAAAA,CAAAA,CAEPN,CACX,CAER","file":"chunk-3XA7WGBV.mjs","sourcesContent":["import { isAsyncFunction } from \"../typecheck/isAsyncFunction\"\n/**\n * 不可重入\n * @param fn \n * @param options \n * @returns \n */\n export function memorize(fn:Function,options:{hash?:((args: any[]) => string) | 'length' | boolean,expires?:number}={hash:false,expires:0}) {\n    let result:any\n    let preHash:string | undefined\n    let timestamp :number = 0\n    if(options.hash == false ) return fn\n\n    const getHash=function(this:any,args: any[]){\n        return options.hash == 'length' ? String(args.length) : (typeof options.hash == 'function' ? options.hash.call(this,args) : undefined )\n    }\n\n    const isInvalid = (hash: string | undefined):boolean => result===undefined || (hash!=undefined && hash!=preHash) || (options.expires && options.expires>0 && timestamp>0 && (Date.now() - timestamp)> options.expires) as boolean\n\n    if(isAsyncFunction(fn)){\n        return async function(this:any,...args:any[]){\n            let hash = getHash.call(this,args)\n            if(isInvalid(hash)){\n                result =await fn.apply(this,args)\n                timestamp = Date.now()\n                preHash = hash\n            }\n            return result\n        }\n    }else{\n        return function(this:any,...args:any[]){\n            let hash = getHash.call(this,args)\n            if(isInvalid(hash)){\n                result = fn.apply(this,args)\n                timestamp = Date.now()\n                preHash = hash\n            }\n            return result\n        }\n    }\n}\n"]}