@@ -11,6 +11,7 @@ import ru.nsk.kstatemachine.event.Event
1111import ru.nsk.kstatemachine.state.IState
1212import ru.nsk.kstatemachine.state.RedirectPseudoState
1313import ru.nsk.kstatemachine.transition.EventAndArgument
14+ import kotlin.jvm.JvmName
1415
1516/* *
1617 * Hint to be used with [ExportMetaInfo]
@@ -27,13 +28,15 @@ sealed interface ResolutionHint
2728internal class StateResolutionHint (
2829 val description : String ,
2930 /* * Allows to specify parallel target states. Must be non-empty */
30- val targetStates : Set <IState >,
31+ lazyTargetStates : Set <Lazy < IState > >,
3132) : ResolutionHint {
3233 init {
33- require(targetStates .isNotEmpty()) {
34+ require(lazyTargetStates .isNotEmpty()) {
3435 " targetStates must be non-empty, use single state or multiple states for parallel transitions"
3536 }
3637 }
38+
39+ val targetStates: Set <IState > by lazy { lazyTargetStates.map { it.value }.toSet() }
3740}
3841
3942/* *
@@ -77,8 +80,24 @@ interface ExportMetaInfoBuilder : ExportMetaInfo {
7780 /* * See [StateResolutionHint] */
7881 fun addStateResolutionHint (description : String , targetState : IState )
7982
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+
8091 /* * 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 >>)
82101
83102 /* * See [EventAndArgumentResolutionHint] */
84103 fun addEventAndArgumentResolutionHint (description : String , event : Event , argument : Any? = null)
@@ -87,17 +106,22 @@ interface ExportMetaInfoBuilder : ExportMetaInfo {
87106private data class ExportMetaInfoBuilderImpl (
88107 override val resolutionHints : MutableSet <ResolutionHint > = mutableSetOf<ResolutionHint >(),
89108) : 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))
93111
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())
97117
98- override fun addStateResolutionHint (description : String , targetStates : Set <IState >) {
118+ override fun addLazyParallelStatesResolutionHint (description : String , targetStates : Set <Lazy < IState > >) {
99119 resolutionHints + = StateResolutionHint (description, targetStates)
100120 }
121+
122+ override fun addEventAndArgumentResolutionHint (description : String , event : Event , argument : Any? ) {
123+ resolutionHints + = EventAndArgumentResolutionHint (description, event, argument)
124+ }
101125}
102126
103127fun buildExportMetaInfo (builder : ExportMetaInfoBuilder .() -> Unit ): ExportMetaInfo =
0 commit comments