@@ -123,16 +123,35 @@ func (g *graph) formatAllStateTransitions(sm *StateMachine, sr *stateRepresentat
123123 return fmt .Sprint (ti ) < fmt .Sprint (tj )
124124 })
125125
126+ type line struct {
127+ source State
128+ destination State
129+ }
130+
131+ lines := make (map [line ][]string , len (triggerList ))
132+ order := make ([]line , 0 , len (triggerList ))
126133 for _ , trigger := range triggerList {
127134 switch t := trigger .(type ) {
128135 case * ignoredTriggerBehaviour :
129- sb .WriteString (g .formatOneTransition (sm , sr .State , sr .State , t .Trigger , nil , t .Guard ))
136+ ln := line {sr .State , sr .State }
137+ if _ , ok := lines [ln ]; ! ok {
138+ order = append (order , ln )
139+ }
140+ lines [ln ] = append (lines [ln ], g .formatOneTransition (t .Trigger , nil , t .Guard ))
130141 case * reentryTriggerBehaviour :
131142 actions := g .getEntryActions (sr .EntryActions , t .Trigger )
132- sb .WriteString (g .formatOneTransition (sm , sr .State , t .Destination , t .Trigger , actions , t .Guard ))
143+ ln := line {sr .State , t .Destination }
144+ if _ , ok := lines [ln ]; ! ok {
145+ order = append (order , ln )
146+ }
147+ lines [ln ] = append (lines [ln ], g .formatOneTransition (t .Trigger , actions , t .Guard ))
133148 case * internalTriggerBehaviour :
134149 actions := g .getEntryActions (sr .EntryActions , t .Trigger )
135- sb .WriteString (g .formatOneTransition (sm , sr .State , sr .State , t .Trigger , actions , t .Guard ))
150+ ln := line {sr .State , sr .State }
151+ if _ , ok := lines [ln ]; ! ok {
152+ order = append (order , ln )
153+ }
154+ lines [ln ] = append (lines [ln ], g .formatOneTransition (t .Trigger , actions , t .Guard ))
136155 case * transitioningTriggerBehaviour :
137156 src := sm .stateConfig [sr .State ]
138157 if src == nil {
@@ -149,15 +168,25 @@ func (g *graph) formatAllStateTransitions(sm *StateMachine, sr *stateRepresentat
149168 } else {
150169 destState = dest .State
151170 }
152- sb .WriteString (g .formatOneTransition (sm , src .State , destState , t .Trigger , actions , t .Guard ))
171+ ln := line {sr .State , destState }
172+ if _ , ok := lines [ln ]; ! ok {
173+ order = append (order , ln )
174+ }
175+ lines [ln ] = append (lines [ln ], g .formatOneTransition (t .Trigger , actions , t .Guard ))
153176 case * dynamicTriggerBehaviour :
154177 // TODO: not supported yet
155178 }
156179 }
180+
181+ for _ , ln := range order {
182+ content := lines [ln ]
183+ sb .WriteString (g .formatOneLine (str (ln .source , true ), str (ln .destination , true ), strings .Join (content , "\\ n" )))
184+ }
185+
157186 return sb .String ()
158187}
159188
160- func (g * graph ) formatOneTransition (sm * StateMachine , source , destination State , trigger Trigger , actions []string , guards transitionGuard ) string {
189+ func (g * graph ) formatOneTransition (trigger Trigger , actions []string , guards transitionGuard ) string {
161190 var sb strings.Builder
162191 sb .WriteString (str (trigger , false ))
163192 if len (actions ) > 0 {
@@ -170,7 +199,7 @@ func (g *graph) formatOneTransition(sm *StateMachine, source, destination State,
170199 }
171200 sb .WriteString (fmt .Sprintf ("[%s]" , esc (info .Description .String (), false )))
172201 }
173- return g . formatOneLine ( str ( source , true ), str ( destination , true ), sb .String () )
202+ return sb .String ()
174203}
175204
176205func (g * graph ) formatOneLine (fromNodeName , toNodeName , label string ) string {
0 commit comments