import { ElementTypeIri, LinkTypeIri, PropertyTypeIri } from '../data/model'; import { FatClassModelEvents, FatLinkTypeEvents, RichPropertyEvents } from '../diagram/elements'; import { DiagramModel } from '../diagram/model'; import { Unsubscribe, Listener } from './events'; export class KeyedObserver { private observedKeys = new Map(); constructor(readonly subscribe: (key: Key) => Unsubscribe | undefined) {} observe(keys: ReadonlyArray) { if (keys.length === 0 && this.observedKeys.size === 0) { return; } const newObservedKeys = new Map(); for (const key of keys) { if (newObservedKeys.has(key)) { continue; } let unsubscribe = this.observedKeys.get(key); if (!unsubscribe) { unsubscribe = this.subscribe(key); } newObservedKeys.set(key, unsubscribe); } this.observedKeys.forEach((unsubscribe, key) => { if (!newObservedKeys.has(key)) { unsubscribe(); } }); this.observedKeys = newObservedKeys; } stopListening() { this.observe([]); } } export function observeElementTypes( model: DiagramModel, event: Event, listener: Listener ) { return new KeyedObserver(key => { const type = model.getClass(key); if (type) { type.events.on(event, listener); return () => type.events.off(event, listener); } return undefined; }); } export function observeProperties( model: DiagramModel, event: Event, listener: Listener ) { return new KeyedObserver(key => { const property = model.getProperty(key); if (property) { property.events.on(event, listener); return () => property.events.off(event, listener); } return undefined; }); } export function observeLinkTypes( model: DiagramModel, event: Event, listener: Listener ) { return new KeyedObserver(key => { const type = model.createLinkType(key); if (type) { type.events.on(event, listener); return () => type.events.off(event, listener); } return undefined; }); }