const SYNC_KEY = '_kestrelMarkerSync' const pointFeatures = (features, keyFor) => (features ?? []) .filter(f => f?.geometry?.type === 'Point') .map(f => ({ feature: f, key: keyFor(f) })) .filter(({ key }) => key != null) export function syncFeatureMarkers(layer, features, { keyFor, create, update }) { const prev = layer[SYNC_KEY] ?? new Map() const next = pointFeatures(features, keyFor).reduce((map, { feature, key }) => { const existing = prev.get(key) if (existing) { update(existing, feature) return new Map([...map, [key, existing]]) } const marker = create(feature) layer.addLayer(marker) return new Map([...map, [key, marker]]) }, new Map()) Array.from(prev.entries()) .filter(([key]) => !next.has(key)) .forEach(([, marker]) => layer.removeLayer(marker)) layer[SYNC_KEY] = next } export function clearFeatureMarkers(layer) { if (!layer) return const prev = layer[SYNC_KEY] if (prev) { Array.from(prev.values()).forEach(marker => layer.removeLayer(marker)) layer[SYNC_KEY] = new Map() return } layer.clearLayers() }