| 
									
										
										
										
											2021-05-10 23:42:01 +02:00
										 |  |  | /// Given a feature source, calculates a list of OSM-contributors who mapped the latest versions
 | 
					
						
							| 
									
										
										
										
											2022-06-19 13:55:33 +02:00
										 |  |  | import { Store, UIEventSource } from "./UIEventSource" | 
					
						
							| 
									
										
										
										
											2021-09-28 17:30:48 +02:00
										 |  |  | import { BBox } from "./BBox" | 
					
						
							| 
									
										
										
										
											2023-03-28 05:13:48 +02:00
										 |  |  | import GeoIndexedStore from "./FeatureSource/Actors/GeoIndexedStore" | 
					
						
							| 
									
										
										
										
											2021-05-10 23:42:01 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | export default class ContributorCount { | 
					
						
							| 
									
										
										
										
											2021-09-21 02:10:42 +02:00
										 |  |  |     public readonly Contributors: UIEventSource<Map<string, number>> = new UIEventSource< | 
					
						
							|  |  |  |         Map<string, number> | 
					
						
							|  |  |  |     >(new Map<string, number>()) | 
					
						
							| 
									
										
										
										
											2023-03-28 05:13:48 +02:00
										 |  |  |     private readonly perLayer: ReadonlyMap<string, GeoIndexedStore> | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |     private lastUpdate: Date = undefined | 
					
						
							| 
									
										
										
										
											2021-05-10 23:42:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-19 13:55:33 +02:00
										 |  |  |     constructor(state: { | 
					
						
							| 
									
										
										
										
											2023-04-07 04:23:45 +02:00
										 |  |  |         mapProperties: { bounds: Store<BBox> } | 
					
						
							| 
									
										
										
										
											2023-03-28 05:13:48 +02:00
										 |  |  |         dataIsLoading: Store<boolean> | 
					
						
							|  |  |  |         perLayer: ReadonlyMap<string, GeoIndexedStore> | 
					
						
							| 
									
										
										
										
											2022-06-19 13:55:33 +02:00
										 |  |  |     }) { | 
					
						
							| 
									
										
										
										
											2023-03-28 05:13:48 +02:00
										 |  |  |         this.perLayer = state.perLayer | 
					
						
							| 
									
										
										
										
											2021-09-21 02:10:42 +02:00
										 |  |  |         const self = this | 
					
						
							| 
									
										
										
										
											2023-04-07 04:23:45 +02:00
										 |  |  |         state.mapProperties.bounds.mapD( | 
					
						
							| 
									
										
										
										
											2023-03-28 05:13:48 +02:00
										 |  |  |             (bbox) => { | 
					
						
							|  |  |  |                 self.update(bbox) | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             [state.dataIsLoading] | 
					
						
							| 
									
										
										
										
											2021-09-21 02:10:42 +02:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-09-21 02:10:42 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     private update(bbox: BBox) { | 
					
						
							|  |  |  |         const now = new Date() | 
					
						
							|  |  |  |         if ( | 
					
						
							|  |  |  |             this.lastUpdate !== undefined && | 
					
						
							|  |  |  |             now.getTime() - this.lastUpdate.getTime() < 1000 * 60 | 
					
						
							|  |  |  |         ) { | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-09-21 03:10:15 +02:00
										 |  |  |         this.lastUpdate = now | 
					
						
							| 
									
										
										
										
											2023-03-28 05:13:48 +02:00
										 |  |  |         const featuresList = [].concat( | 
					
						
							|  |  |  |             Array.from(this.perLayer.values()).map((fs) => fs.GetFeaturesWithin(bbox)) | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2021-09-21 02:10:42 +02:00
										 |  |  |         const hist = new Map<string, number>() | 
					
						
							|  |  |  |         for (const list of featuresList) { | 
					
						
							|  |  |  |             for (const feature of list) { | 
					
						
							|  |  |  |                 const contributor = feature.properties["_last_edit:contributor"] | 
					
						
							| 
									
										
										
										
											2021-05-10 23:42:01 +02:00
										 |  |  |                 const count = hist.get(contributor) ?? 0 | 
					
						
							|  |  |  |                 hist.set(contributor, count + 1) | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-09-21 02:10:42 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |         this.Contributors.setData(hist) | 
					
						
							| 
									
										
										
										
											2021-05-10 23:42:01 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | } |