@@ -72,37 +72,26 @@ func (sr *stateRepresentation) FindHandler(ctx context.Context, trigger Trigger,
72
72
}
73
73
74
74
func (sr * stateRepresentation ) findHandler (ctx context.Context , trigger Trigger , args ... any ) (result triggerBehaviourResult , ok bool ) {
75
- var (
76
- possibleBehaviours []triggerBehaviour
77
- )
78
- if possibleBehaviours , ok = sr .TriggerBehaviours [trigger ]; ! ok {
75
+ possibleBehaviours , ok := sr .TriggerBehaviours [trigger ]
76
+ if ! ok {
79
77
return
80
78
}
81
- allResults := make ([] triggerBehaviourResult , 0 , len ( possibleBehaviours ))
79
+ var unmet [] string
82
80
for _ , behaviour := range possibleBehaviours {
83
- allResults = append (allResults , triggerBehaviourResult {
84
- Handler : behaviour ,
85
- UnmetGuardConditions : behaviour .UnmetGuardConditions (ctx , args ... ),
86
- })
87
- }
88
- metResults := make ([]triggerBehaviourResult , 0 , len (allResults ))
89
- unmetResults := make ([]triggerBehaviourResult , 0 , len (allResults ))
90
- for _ , result := range allResults {
91
- if len (result .UnmetGuardConditions ) == 0 {
92
- metResults = append (metResults , result )
93
- } else {
94
- unmetResults = append (unmetResults , result )
81
+ unmet = behaviour .UnmetGuardConditions (ctx , unmet [:0 ], args ... )
82
+ if len (unmet ) == 0 {
83
+ if result .Handler != nil && len (result .UnmetGuardConditions ) == 0 {
84
+ panic (fmt .Sprintf ("stateless: Multiple permitted exit transitions are configured from state '%v' for trigger '%v'. Guard clauses must be mutually exclusive." , sr .State , trigger ))
85
+ }
86
+ result .Handler = behaviour
87
+ result .UnmetGuardConditions = nil
88
+ } else if result .Handler == nil {
89
+ result .Handler = behaviour
90
+ result .UnmetGuardConditions = make ([]string , len (unmet ))
91
+ copy (result .UnmetGuardConditions , unmet )
95
92
}
96
93
}
97
- if len (metResults ) > 1 {
98
- panic (fmt .Sprintf ("stateless: Multiple permitted exit transitions are configured from state '%v' for trigger '%v'. Guard clauses must be mutually exclusive." , sr .State , trigger ))
99
- }
100
- if len (metResults ) == 1 {
101
- result , ok = metResults [0 ], true
102
- } else if len (unmetResults ) > 0 {
103
- result , ok = unmetResults [0 ], false
104
- }
105
- return
94
+ return result , result .Handler != nil && len (result .UnmetGuardConditions ) == 0
106
95
}
107
96
108
97
func (sr * stateRepresentation ) Activate (ctx context.Context ) error {
@@ -210,9 +199,10 @@ func (sr *stateRepresentation) AddTriggerBehaviour(tb triggerBehaviour) {
210
199
}
211
200
212
201
func (sr * stateRepresentation ) PermittedTriggers (ctx context.Context , args ... any ) (triggers []Trigger ) {
202
+ var unmet []string
213
203
for key , value := range sr .TriggerBehaviours {
214
204
for _ , tb := range value {
215
- if len (tb .UnmetGuardConditions (ctx , args ... )) == 0 {
205
+ if len (tb .UnmetGuardConditions (ctx , unmet [: 0 ], args ... )) == 0 {
216
206
triggers = append (triggers , key )
217
207
break
218
208
}
0 commit comments