@@ -324,14 +324,20 @@ func (fb *flowBuilder) addEnumSplit(s *ast.EnumSplitStmt) model.ID {
324324 branchWidth = HorizontalSpacing / 2
325325 }
326326 mergeX := splitX + SplitWidth + HorizontalSpacing / 2 + branchWidth + HorizontalSpacing / 2
327- merge := & microflows.ExclusiveMerge {
328- BaseMicroflowObject : microflows.BaseMicroflowObject {
329- BaseElement : model.BaseElement {ID : model .ID (types .GenerateID ())},
330- Position : model.Point {X : mergeX , Y : centerY },
331- Size : model.Size {Width : MergeSize , Height : MergeSize },
332- },
327+ var merge * microflows.ExclusiveMerge
328+ ensureMerge := func () * microflows.ExclusiveMerge {
329+ if merge == nil {
330+ merge = & microflows.ExclusiveMerge {
331+ BaseMicroflowObject : microflows.BaseMicroflowObject {
332+ BaseElement : model.BaseElement {ID : model .ID (types .GenerateID ())},
333+ Position : model.Point {X : mergeX , Y : centerY },
334+ Size : model.Size {Width : MergeSize , Height : MergeSize },
335+ },
336+ }
337+ fb .objects = append (fb .objects , merge )
338+ }
339+ return merge
333340 }
334- fb .objects = append (fb .objects , merge )
335341
336342 savedEndsWithReturn := fb .endsWithReturn
337343 allBranchesReturn := len (branches ) > 0
@@ -353,7 +359,7 @@ func (fb *flowBuilder) addEnumSplit(s *ast.EnumSplitStmt) model.ID {
353359 fb .pendingAnnotations = nil
354360 }
355361 if lastID == "" {
356- fb .addEnumSplitFlows (splitID , actID , br .values , i )
362+ fb .addGroupedEnumSplitFlows (splitID , actID , br .values , i , splitX + SplitWidth + HorizontalSpacing / 4 , branchY )
357363 } else {
358364 if pendingCase != "" {
359365 fb .flows = append (fb .flows , newHorizontalFlowWithCase (lastID , actID , pendingCase ))
@@ -377,12 +383,12 @@ func (fb *flowBuilder) addEnumSplit(s *ast.EnumSplitStmt) model.ID {
377383 }
378384 allBranchesReturn = false
379385 if lastID == "" {
380- fb .addEnumSplitFlows (splitID , merge .ID , br .values , i )
386+ fb .addGroupedEnumSplitFlows (splitID , ensureMerge () .ID , br .values , i , splitX + SplitWidth + HorizontalSpacing / 4 , branchY )
381387 } else {
382388 if pendingCase != "" {
383- fb .flows = append (fb .flows , newHorizontalFlowWithCase (lastID , merge .ID , pendingCase ))
389+ fb .flows = append (fb .flows , newHorizontalFlowWithCase (lastID , ensureMerge () .ID , pendingCase ))
384390 } else {
385- fb .flows = append (fb .flows , newHorizontalFlow (lastID , merge .ID ))
391+ fb .flows = append (fb .flows , newHorizontalFlow (lastID , ensureMerge () .ID ))
386392 }
387393 }
388394 }
@@ -393,11 +399,28 @@ func (fb *flowBuilder) addEnumSplit(s *ast.EnumSplitStmt) model.ID {
393399 if allBranchesReturn {
394400 fb .endsWithReturn = true
395401 } else {
396- fb .nextConnectionPoint = merge .ID
402+ fb .nextConnectionPoint = ensureMerge () .ID
397403 }
398404 return splitID
399405}
400406
407+ func (fb * flowBuilder ) addGroupedEnumSplitFlows (originID , destinationID model.ID , values []string , order int , mergeX , mergeY int ) {
408+ if len (values ) <= 1 {
409+ fb .addEnumSplitFlows (originID , destinationID , values , order )
410+ return
411+ }
412+ branchMerge := & microflows.ExclusiveMerge {
413+ BaseMicroflowObject : microflows.BaseMicroflowObject {
414+ BaseElement : model.BaseElement {ID : model .ID (types .GenerateID ())},
415+ Position : model.Point {X : mergeX , Y : mergeY },
416+ Size : model.Size {Width : MergeSize , Height : MergeSize },
417+ },
418+ }
419+ fb .objects = append (fb .objects , branchMerge )
420+ fb .addEnumSplitFlows (originID , branchMerge .ID , values , order )
421+ fb .flows = append (fb .flows , newHorizontalFlow (branchMerge .ID , destinationID ))
422+ }
423+
401424func (fb * flowBuilder ) addEnumSplitFlows (originID , destinationID model.ID , values []string , order int ) {
402425 if len (values ) == 0 {
403426 flow := newHorizontalFlow (originID , destinationID )
0 commit comments