diff --git a/src/lib/data_structures/publication_tree.ts b/src/lib/data_structures/publication_tree.ts new file mode 100644 index 0000000..07c7f84 --- /dev/null +++ b/src/lib/data_structures/publication_tree.ts @@ -0,0 +1,57 @@ +import type { NDKEvent } from "@nostr-dev-kit/ndk"; + +interface PublicationTreeNode { + address: string; + parent?: PublicationTreeNode; + children?: PublicationTreeNode[]; +} + +// TODO: Add public method(s) for event retrieval. +// TODO: Add methods for DFS and BFS traversal-retrieval. +export class PublicationTree { + private root: PublicationTreeNode; + private nodes: Map; + private events: Map; + + constructor(rootEvent: NDKEvent) { + const rootAddress = this.getAddress(rootEvent); + this.root = { address: rootAddress, children: [] }; + + this.nodes = new Map(); + this.nodes.set(rootAddress, this.root); + + this.events = new Map(); + this.events.set(rootAddress, rootEvent); + } + + addEvent(event: NDKEvent, parentEvent: NDKEvent) { + const address = this.getAddress(event); + const parentAddress = this.getAddress(parentEvent); + const parentNode = this.nodes.get(parentAddress); + + if (!parentNode) { + throw new Error( + `PublicationTree: Parent node with address ${parentAddress} not found.` + ); + } + + const node = { + address, + parent: parentNode, + children: [], + }; + parentNode.children!.push(node); + this.nodes.set(address, node); + this.events.set(address, event); + } + + private getAddress(event: NDKEvent): string { + if (event.kind! < 30000 || event.kind! >= 40000) { + throw new Error( + "PublicationTree: Invalid event kind. Event kind must be in the range 30000-39999" + ); + } + + return `${event.kind}:${event.pubkey}:${event.dTag}`; + } +} \ No newline at end of file