@@ -20,28 +20,53 @@ public Task<CommandResult> Handle(Command request, CancellationToken cancellatio
2020 return Task . FromResult ( CommandResult . Pass ( ) ) ;
2121 }
2222
23+ // When one node is local (negative) and one is on the server (positive), always keep the server node.
24+ long sourceId = request . SourceNodeId > 0 && request . TargetNodeId < 0
25+ ? request . TargetNodeId
26+ : request . SourceNodeId ;
27+ long targetId = sourceId == request . SourceNodeId ? request . TargetNodeId : request . SourceNodeId ;
28+
2329 ImmutableDictionary < long , OsmWay > ways = state . Ways ;
2430 ImmutableDictionary < OsmElementRef , EditState > editStates = state . EditStates ;
2531
2632 foreach ( ( long wayId , OsmWay way ) in state . Ways )
2733 {
28- if ( ! way . NodeIds . Contains ( request . SourceNodeId ) ) { continue ; }
29- long [ ] newNodeIds = [ .. way . NodeIds . Select ( id => id == request . SourceNodeId ? request . TargetNodeId : id ) ] ;
34+ if ( ! way . NodeIds . Contains ( sourceId ) )
35+ {
36+ continue ;
37+ }
38+
39+ IReadOnlyList < long > newNodeIds = DeduplicateConsecutive ( [ .. way . NodeIds . Select ( id => id == sourceId ? targetId : id ) ] ) ;
3040 OsmWay updated = way with { NodeIds = newNodeIds } ;
3141 ways = ways . SetItem ( wayId , updated ) ;
42+
3243 EditState es = editStates . TryGetValue ( updated . Ref , out EditState ex ) && ex == EditState . Created
3344 ? EditState . Created
3445 : EditState . Modified ;
3546 editStates = editStates . SetItem ( updated . Ref , es ) ;
3647 }
3748
38- OsmElementRef sourceRef = new ( OsmElementTypes . Node , request . SourceNodeId ) ;
49+ OsmElementRef sourceRef = new ( OsmElementTypes . Node , sourceId ) ;
3950 editBufferState . SetState ( state with
4051 {
41- Nodes = state . Nodes . Remove ( request . SourceNodeId ) ,
52+ Nodes = state . Nodes . Remove ( sourceId ) ,
4253 Ways = ways ,
4354 EditStates = editStates . Remove ( sourceRef )
4455 } ) ;
4556 return Task . FromResult ( CommandResult . Pass ( ) ) ;
4657 }
58+
59+ private static IReadOnlyList < long > DeduplicateConsecutive ( IReadOnlyList < long > ids )
60+ {
61+ List < long > result = [ ] ;
62+ foreach ( long id in ids )
63+ {
64+ if ( result . Count == 0 || result [ ^ 1 ] != id )
65+ {
66+ result . Add ( id ) ;
67+ }
68+ }
69+
70+ return result ;
71+ }
4772}
0 commit comments