tuil
ReferencePackages@mwillbanks/tuil-inkAPI

SemanticRegistry

class exported by @mwillbanks/tuil-ink.

View rawEdit

class

Public class exported by @mwillbanks/tuil-ink.

export class SemanticRegistry {
  readonly #nodes: Map<string, SemanticNode>;
  readonly #observers: Set<() => void>;
  readonly #layout?: LayoutProjection;

  constructor(layout?: LayoutProjection) {
    this.#nodes = new Map();
    this.#observers = new Set();
    this.#layout = layout;
  }

  register(node: SemanticNode): () => void {
    this.#nodes.set(node.key, Object.freeze({ ...node }));
    this.#project(node);
    this.#notify();
    return () => {
      this.#nodes.delete(node.key);
      this.#layout?.remove(node.id ?? node.key);
      this.#notify();
    };
  }

  update(node: SemanticNode): void {
    this.#nodes.set(node.key, Object.freeze({ ...node }));
    this.#project(node);
    this.#notify();
  }

  nodes(): readonly SemanticNode[] {
    return [...this.#nodes.values()];
  }

  observe(observer: () => void): () => void {
    this.#observers.add(observer);
    return deleteOnDispose(this.#observers, observer);
  }

  #notify(): void {
    for (const observer of this.#observers) observer();
  }

  #project(node: SemanticNode): void {
    if (!this.#layout || !node.layout) return;
    this.#layout.upsert({
      id: node.id ?? node.key,
      ...node.layout,
      semantics: node,
    });
  }
}

Members

MemberTypeRequiredDescriptionRelated types
#nodesMap<string, SemanticNode>YesThe #nodes member uses the Map<string, SemanticNode> contract.SemanticNode
#observersSet<() => void>YesThe #observers member uses the Set<() => void> contract.
#layoutLayoutProjection | undefinedNoThe #layout member uses the LayoutProjection | undefined contract.
__constructoranyYesThe __constructor member uses the any contract.
register(node: SemanticNode) => () => voidYesThe register member uses the (node: SemanticNode) => () => void contract.SemanticNode
update(node: SemanticNode) => voidYesThe update member uses the (node: SemanticNode) => void contract.SemanticNode
nodes() => readonly SemanticNode[]YesThe nodes member uses the () => readonly SemanticNode[] contract.SemanticNode
observe(observer: () => void) => () => voidYesThe observe member uses the (observer: () => void) => () => void contract.
#notify() => voidYesThe #notify member uses the () => void contract.
#project(node: SemanticNode) => voidYesThe #project member uses the (node: SemanticNode) => void contract.SemanticNode

Parameters

This declaration has no public members.

Returns

This declaration does not return a value.

Throws

No thrown errors are documented for this declaration.

Source

View the secondary source reference

Package

@mwillbanks/tuil-ink

On this page