{"version":3,"file":"memo.cjs","names":["createVestIsolate","IsolateSelectors","registerReconciler","makeResult","Walker","VestTest"],"sources":["../../src/exports/memo.ts"],"sourcesContent":["import {\n  cache,\n  CacheApi,\n  CB,\n  Nullable,\n  isNullish,\n  makeResult,\n  Result,\n  unwrap,\n  CacheConfig,\n} from 'vest-utils';\nimport { TIsolate, IsolateSelectors, Walker } from 'vestjs-runtime';\n\nimport { TIsolateTest } from '../core/isolate/IsolateTest/IsolateTest';\nimport { VestTest } from '../core/isolate/IsolateTest/VestTest';\nimport {\n  createVestIsolate,\n  TVestIsolate,\n} from '../core/isolate/VestIsolateType';\nimport { registerReconciler } from '../vest';\n\nconst isolateType = 'Memo';\n\nexport type MemoOptions = {\n  cacheSize?: number;\n  ttl?: number;\n};\n\nexport function memo<Callback extends CB = CB>(\n  callback: Callback,\n  dependencies: unknown[],\n  options?: MemoOptions,\n): TIsolateMemo {\n  return createVestIsolate(isolateType, callback, {\n    dependencies,\n    cache: null,\n    options,\n  });\n}\n\nclass IsolateMemoReconciler {\n  static match(currentNode: TIsolate, historyNode: TIsolate): boolean {\n    return (\n      IsolateSelectors.isIsolateType(currentNode, isolateType) &&\n      IsolateSelectors.isIsolateType(historyNode, isolateType)\n    );\n  }\n\n  static reconcile(current: TIsolateMemo, history: TIsolateMemo): TIsolateMemo {\n    const historyWithCache = unwrap(initializeCache(history));\n\n    const hit = historyWithCache.data.cache.get(current.data.dependencies);\n    current.data.cache = historyWithCache.data.cache;\n\n    if (isNullish(hit)) {\n      return handleCacheMiss(current, historyWithCache);\n    }\n\n    const historicHit = hit[1];\n\n    if (isCanceledTest(historicHit)) {\n      historyWithCache.data.cache.invalidate(current.data.dependencies);\n      return handleCacheMiss(current, historyWithCache);\n    }\n\n    return historicHit;\n  }\n}\n\ntype TIsolateMemo = TVestIsolate<IsolateMemoPayload>;\n\ntype TIsolateMemoWithCache = TIsolateMemo & {\n  data: { cache: CacheApi<TIsolateMemo> };\n};\n\ntype IsolateMemoPayload = {\n  dependencies: unknown[];\n  cache: Nullable<CacheApi<TIsolateMemo>>;\n  options?: MemoOptions;\n};\n\nregisterReconciler(IsolateMemoReconciler);\n\nfunction initializeCache(\n  history: TIsolateMemo,\n): Result<TIsolateMemoWithCache, string> {\n  if (isNullish(history.data.cache)) {\n    history.data.cache = cache<TIsolateMemo>(\n      getMemoCacheConfig(history.data.options),\n    );\n    history.data.cache(history.data.dependencies, () => history);\n  }\n\n  return isNullish(history.data.cache)\n    ? makeResult.Err('Cache initialization failed')\n    : makeResult.Ok(history as TIsolateMemoWithCache);\n}\n\nfunction handleCacheMiss(\n  current: TIsolateMemo,\n  history: TIsolateMemoWithCache,\n): TIsolateMemo {\n  history.data.cache(current.data.dependencies, () => current);\n  return current;\n}\n\nfunction isCanceledTest(historicHit: TIsolateMemo): boolean {\n  return Walker.some(\n    historicHit,\n    i => VestTest.isCanceled(i as TIsolateTest).unwrap(),\n    VestTest.is,\n  );\n}\n\nfunction getMemoCacheConfig(options?: MemoOptions): CacheConfig {\n  return {\n    maxSize: options?.cacheSize ?? 5,\n    ttl: options?.ttl,\n  };\n}\n"],"mappings":";;;;;;;AAqBA,MAAM,cAAc;AAOpB,SAAgB,KACd,UACA,cACA,SACc;AACd,QAAOA,+BAAkB,aAAa,UAAU;EAC9C;EACA,OAAO;EACP;EACD,CAAC;;AAGJ,IAAM,wBAAN,MAA4B;CAC1B,OAAO,MAAM,aAAuB,aAAgC;AAClE,SACEC,gCAAiB,cAAc,aAAa,YAAY,IACxDA,gCAAiB,cAAc,aAAa,YAAY;;CAI5D,OAAO,UAAU,SAAuB,SAAqC;EAC3E,MAAM,0CAA0B,gBAAgB,QAAQ,CAAC;EAEzD,MAAM,MAAM,iBAAiB,KAAK,MAAM,IAAI,QAAQ,KAAK,aAAa;AACtE,UAAQ,KAAK,QAAQ,iBAAiB,KAAK;AAE3C,gCAAc,IAAI,CAChB,QAAO,gBAAgB,SAAS,iBAAiB;EAGnD,MAAM,cAAc,IAAI;AAExB,MAAI,eAAe,YAAY,EAAE;AAC/B,oBAAiB,KAAK,MAAM,WAAW,QAAQ,KAAK,aAAa;AACjE,UAAO,gBAAgB,SAAS,iBAAiB;;AAGnD,SAAO;;;AAgBXC,gCAAmB,sBAAsB;AAEzC,SAAS,gBACP,SACuC;AACvC,+BAAc,QAAQ,KAAK,MAAM,EAAE;AACjC,UAAQ,KAAK,8BACX,mBAAmB,QAAQ,KAAK,QAAQ,CACzC;AACD,UAAQ,KAAK,MAAM,QAAQ,KAAK,oBAAoB,QAAQ;;AAG9D,kCAAiB,QAAQ,KAAK,MAAM,GAChCC,sBAAW,IAAI,8BAA8B,GAC7CA,sBAAW,GAAG,QAAiC;;AAGrD,SAAS,gBACP,SACA,SACc;AACd,SAAQ,KAAK,MAAM,QAAQ,KAAK,oBAAoB,QAAQ;AAC5D,QAAO;;AAGT,SAAS,eAAe,aAAoC;AAC1D,QAAOC,sBAAO,KACZ,cACA,MAAKC,sBAAS,WAAW,EAAkB,CAAC,QAAQ,EACpDA,sBAAS,GACV;;AAGH,SAAS,mBAAmB,SAAoC;AAC9D,QAAO;EACL,SAAS,SAAS,aAAa;EAC/B,KAAK,SAAS;EACf"}