@@ -11,6 +11,7 @@ import ru.nsk.kstatemachine.event.Event
11
11
import ru.nsk.kstatemachine.state.IState
12
12
import ru.nsk.kstatemachine.state.RedirectPseudoState
13
13
import ru.nsk.kstatemachine.transition.EventAndArgument
14
+ import kotlin.jvm.JvmName
14
15
15
16
/* *
16
17
* Hint to be used with [ExportMetaInfo]
@@ -27,13 +28,15 @@ sealed interface ResolutionHint
27
28
internal class StateResolutionHint (
28
29
val description : String ,
29
30
/* * Allows to specify parallel target states. Must be non-empty */
30
- val targetStates : Set <IState >,
31
+ lazyTargetStates : Set <Lazy < IState > >,
31
32
) : ResolutionHint {
32
33
init {
33
- require(targetStates .isNotEmpty()) {
34
+ require(lazyTargetStates .isNotEmpty()) {
34
35
" targetStates must be non-empty, use single state or multiple states for parallel transitions"
35
36
}
36
37
}
38
+
39
+ val targetStates: Set <IState > by lazy { lazyTargetStates.map { it.value }.toSet() }
37
40
}
38
41
39
42
/* *
@@ -77,8 +80,24 @@ interface ExportMetaInfoBuilder : ExportMetaInfo {
77
80
/* * See [StateResolutionHint] */
78
81
fun addStateResolutionHint (description : String , targetState : IState )
79
82
83
+ /* *
84
+ * Allows to specify state as lazy value.
85
+ * Lazy initializer should not be used to dynamically calculate a state.
86
+ * Use it only to delay state's variable access.
87
+ * See [StateResolutionHint]
88
+ */
89
+ fun addLazyStateResolutionHint (description : String , targetState : Lazy <IState >)
90
+
80
91
/* * See [StateResolutionHint] */
81
- fun addStateResolutionHint (description : String , targetStates : Set <IState >)
92
+ fun addParallelStatesResolutionHint (description : String , targetStates : Set <IState >)
93
+
94
+ /* *
95
+ * Allows to specify parallel states as lazy values.
96
+ * Lazy initializer should not be used to dynamically calculate state.
97
+ * Use it only to delay state's variable access.
98
+ * See [StateResolutionHint]
99
+ */
100
+ fun addLazyParallelStatesResolutionHint (description : String , targetStates : Set <Lazy <IState >>)
82
101
83
102
/* * See [EventAndArgumentResolutionHint] */
84
103
fun addEventAndArgumentResolutionHint (description : String , event : Event , argument : Any? = null)
@@ -87,17 +106,22 @@ interface ExportMetaInfoBuilder : ExportMetaInfo {
87
106
private data class ExportMetaInfoBuilderImpl (
88
107
override val resolutionHints : MutableSet <ResolutionHint > = mutableSetOf<ResolutionHint >(),
89
108
) : ExportMetaInfoBuilder {
90
- override fun addEventAndArgumentResolutionHint (description : String , event : Event , argument : Any? ) {
91
- resolutionHints + = EventAndArgumentResolutionHint (description, event, argument)
92
- }
109
+ override fun addStateResolutionHint (description : String , targetState : IState ) =
110
+ addLazyStateResolutionHint(description, lazyOf(targetState))
93
111
94
- override fun addStateResolutionHint (description : String , targetState : IState ) {
95
- resolutionHints + = StateResolutionHint (description, setOf (targetState))
96
- }
112
+ override fun addLazyStateResolutionHint (description : String , targetState : Lazy <IState >) =
113
+ addLazyParallelStatesResolutionHint(description, setOf (targetState))
114
+
115
+ override fun addParallelStatesResolutionHint (description : String , targetStates : Set <IState >) =
116
+ addLazyParallelStatesResolutionHint(description, targetStates.map { lazyOf(it) }.toSet())
97
117
98
- override fun addStateResolutionHint (description : String , targetStates : Set <IState >) {
118
+ override fun addLazyParallelStatesResolutionHint (description : String , targetStates : Set <Lazy < IState > >) {
99
119
resolutionHints + = StateResolutionHint (description, targetStates)
100
120
}
121
+
122
+ override fun addEventAndArgumentResolutionHint (description : String , event : Event , argument : Any? ) {
123
+ resolutionHints + = EventAndArgumentResolutionHint (description, event, argument)
124
+ }
101
125
}
102
126
103
127
fun buildExportMetaInfo (builder : ExportMetaInfoBuilder .() -> Unit ): ExportMetaInfo =
0 commit comments