Memoization - structural memoization

by Dawid Ryłko

HTML

<!-- Memoizacja strukturalna -->

<a href="https://dawidrylko.com/memoizacja-harry-potter-i-myslodsiewnia/" target="_blank">Memoizacja strukturalna</a>

TypeScript

class Character {
  constructor(
    public readonly value: string,
    public readonly children: Character[] = [],
  ) {}
}

const characterCache = new Map<string, Character>();

const createSharedCharacter = (value: string, children: Character[] = []): Character => {
  const key = `${value}:${children.map((c) => c.value).join(',')}`;
  
  if (characterCache.has(key)) {
    console.log(`♻️ Sharing character: ${value}`);
    return characterCache.get(key)!;
  }
  
  console.log(`✨ Creating new character: ${value}`);
  const newCharacter = new Character(value, children);
  characterCache.set(key, newCharacter);
  return newCharacter;
};

const pureBlood = createSharedCharacter('Pure blood');
const halfBlood = createSharedCharacter('Half blood');
const harry = createSharedCharacter('Harry', [halfBlood]);
const draco = createSharedCharacter('Draco', [pureBlood]);
const dracoTwin = createSharedCharacter('Draco', [pureBlood]);

console.log(harry !== draco);
console.log(draco === dracoTwin);