/// 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>(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) } }