/// Given a feature source, calculates a list of OSM-contributors who mapped the latest versions import { Store, UIEventSource } from "./UIEventSource" import FeaturePipeline from "./FeatureSource/FeaturePipeline" import Loc from "../Models/Loc" import { BBox } from "./BBox" export default class ContributorCount { public readonly Contributors: UIEventSource> = new UIEventSource< Map >(new Map()) private readonly state: { featurePipeline: FeaturePipeline currentBounds: Store locationControl: Store } private lastUpdate: Date = undefined constructor(state: { featurePipeline: FeaturePipeline currentBounds: Store locationControl: Store }) { this.state = state const self = this state.currentBounds.map((bbox) => { self.update(bbox) }) state.featurePipeline.runningQuery.addCallbackAndRun((_) => self.update(state.currentBounds.data) ) } private update(bbox: BBox) { if (bbox === undefined) { return } const now = new Date() if ( this.lastUpdate !== undefined && now.getTime() - this.lastUpdate.getTime() < 1000 * 60 ) { return } this.lastUpdate = now const featuresList = this.state.featurePipeline.GetAllFeaturesWithin(bbox) const hist = new Map() for (const list of featuresList) { for (const feature of list) { const contributor = feature.properties["_last_edit:contributor"] const count = hist.get(contributor) ?? 0 hist.set(contributor, count + 1) } } this.Contributors.setData(hist) } }