Skip to content

Commit 93dd162

Browse files
Merge pull request #1106 from square/sedwards/session-workflow-scope
Add CoroutineScope to initialState; SessionWorkflow to aid rollout
2 parents a69a23c + 40e106e commit 93dd162

File tree

22 files changed

+836
-38
lines changed

22 files changed

+836
-38
lines changed

workflow-core/api/workflow-core.api

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,21 @@ public final class com/squareup/workflow1/PropsUpdated : com/squareup/workflow1/
9191
public static final field INSTANCE Lcom/squareup/workflow1/PropsUpdated;
9292
}
9393

94+
public abstract class com/squareup/workflow1/SessionWorkflow : com/squareup/workflow1/StatefulWorkflow {
95+
public fun <init> ()V
96+
public final fun initialState (Ljava/lang/Object;Lcom/squareup/workflow1/Snapshot;)Ljava/lang/Object;
97+
public abstract fun initialState (Ljava/lang/Object;Lcom/squareup/workflow1/Snapshot;Lkotlinx/coroutines/CoroutineScope;)Ljava/lang/Object;
98+
}
99+
100+
public final class com/squareup/workflow1/SessionWorkflowKt {
101+
public static final fun sessionWorkflow (Lcom/squareup/workflow1/Workflow$Companion;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)Lcom/squareup/workflow1/SessionWorkflow;
102+
public static final fun sessionWorkflow (Lcom/squareup/workflow1/Workflow$Companion;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)Lcom/squareup/workflow1/SessionWorkflow;
103+
public static final fun sessionWorkflow (Lcom/squareup/workflow1/Workflow$Companion;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;)Lcom/squareup/workflow1/SessionWorkflow;
104+
public static final fun sessionWorkflow (Lcom/squareup/workflow1/Workflow$Companion;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function3;)Lcom/squareup/workflow1/SessionWorkflow;
105+
public static synthetic fun sessionWorkflow$default (Lcom/squareup/workflow1/Workflow$Companion;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lcom/squareup/workflow1/SessionWorkflow;
106+
public static synthetic fun sessionWorkflow$default (Lcom/squareup/workflow1/Workflow$Companion;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lcom/squareup/workflow1/SessionWorkflow;
107+
}
108+
94109
public abstract interface class com/squareup/workflow1/Sink {
95110
public abstract fun send (Ljava/lang/Object;)V
96111
}
@@ -142,6 +157,7 @@ public abstract class com/squareup/workflow1/StatefulWorkflow : com/squareup/wor
142157
public final fun asStatefulWorkflow ()Lcom/squareup/workflow1/StatefulWorkflow;
143158
public fun getCachedIdentifier ()Lcom/squareup/workflow1/WorkflowIdentifier;
144159
public abstract fun initialState (Ljava/lang/Object;Lcom/squareup/workflow1/Snapshot;)Ljava/lang/Object;
160+
public fun initialState (Ljava/lang/Object;Lcom/squareup/workflow1/Snapshot;Lkotlinx/coroutines/CoroutineScope;)Ljava/lang/Object;
145161
public fun onPropsChanged (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
146162
public abstract fun render (Ljava/lang/Object;Ljava/lang/Object;Lcom/squareup/workflow1/StatefulWorkflow$RenderContext;)Ljava/lang/Object;
147163
public fun setCachedIdentifier (Lcom/squareup/workflow1/WorkflowIdentifier;)V
@@ -240,6 +256,9 @@ public final class com/squareup/workflow1/WorkflowAction$Updater {
240256
public final fun setState (Ljava/lang/Object;)V
241257
}
242258

259+
public abstract interface annotation class com/squareup/workflow1/WorkflowExperimentalApi : java/lang/annotation/Annotation {
260+
}
261+
243262
public final class com/squareup/workflow1/WorkflowIdentifier {
244263
public static final field Companion Lcom/squareup/workflow1/WorkflowIdentifier$Companion;
245264
public fun equals (Ljava/lang/Object;)Z

workflow-core/src/commonMain/kotlin/com/squareup/workflow1/BaseRenderContext.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,23 @@ public interface BaseRenderContext<out PropsT, StateT, in OutputT> {
9595
* that the workflow runtime is running in. The side effect coroutine will not be started until
9696
* _after_ the first render call than runs it returns.
9797
*
98+
* Note that there is currently an [issue](https://github.com/square/workflow-kotlin/issues/1093)
99+
* when a [runningSideEffect] (and thus also [runningWorker], or the parent Workflow of either
100+
* via [renderChild]) is declared as running (or rendering) in one render pass and
101+
* then not declared in the next render pass and both those consecutive render passes happen
102+
* synchronously - i.e. without the [CoroutineDispatcher][kotlinx.coroutines.CoroutineDispatcher]
103+
* for the Workflow runtime being able to dispatch asynchronously. This is because the jobs for
104+
* side effects are launched lazily in order to ensure they happen after the render pass, but if
105+
* the [CoroutineScope]'s job (the parent for all these jobs) is cancelled before these lazy
106+
* coroutines have a chance to dispatch, then they will never run at all. For more details, and
107+
* to report problems with this, see the [issue](https://github.com/square/workflow-kotlin/issues/1093).
108+
* If you need guaranteed execution for some code in this scenario (like for cleanup),
109+
* please use a [SessionWorkflow] and the [SessionWorkflow.initialState] that provides the
110+
* [CoroutineScope] which is equivalent to the lifetime of the Workflow node in the tree. The
111+
* [Job][kotlinx.coroutines.Job] can be extracted from that and used to get guaranteed to be
112+
* executed lifecycle hooks, e.g. via [Job.invokeOnCompletion][kotlinx.coroutines.Job.invokeOnCompletion].
113+
*
114+
*
98115
* @param key The string key that is used to distinguish between side effects.
99116
* @param sideEffect The suspend function that will be launched in a coroutine to perform the
100117
* side effect.
@@ -281,6 +298,10 @@ public inline fun <reified W : Worker<Nothing>, PropsT, StateT, OutputT>
281298
* pass a worker stored in a variable to this function, the type that will be used to compare the
282299
* worker will be the type of the variable, not the type of the object the variable refers to.
283300
*
301+
* Note that there is currently an [issue](https://github.com/square/workflow-kotlin/issues/1093)
302+
* which can effect whether a [Worker] is ever executed.
303+
* See more details at [BaseRenderContext.runningSideEffect].
304+
*
284305
* @param key An optional string key that is used to distinguish between identical [Worker]s.
285306
*/
286307
public inline fun <T, reified W : Worker<T>, PropsT, StateT, OutputT>

workflow-core/src/commonMain/kotlin/com/squareup/workflow1/LifecycleWorker.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ import kotlin.jvm.JvmName
1414
*
1515
* A [Worker] is stopped when its parent [Workflow] finishes a render pass without running the
1616
* worker, or when the parent workflow is itself torn down.
17+
*
18+
* Note that there is currently an [issue](https://github.com/square/workflow-kotlin/issues/1093)
19+
* which can effect whether a [LifecycleWorker] is ever executed.
20+
* See more details at [BaseRenderContext.runningSideEffect].
1721
*/
1822
public abstract class LifecycleWorker : Worker<Nothing> {
1923

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
package com.squareup.workflow1
2+
3+
import kotlinx.coroutines.CoroutineScope
4+
5+
/**
6+
* An extension of [StatefulWorkflow] that gives [initialState] a [CoroutineScope]
7+
* that corresponds with the lifetime of _session_ driven by this Workflow.
8+
*
9+
* A session begins the first time a parent passes a child [Workflow] of a particular type to
10+
* [renderChild] with a particular [key] parameter. It ends when the parent executes [render]
11+
* without making a matching [renderChild] call. The [CoroutineScope] that is passed to
12+
* [initialState] is created when a session starts (when [renderChild] is first called), and
13+
* [cancelled][kotlinx.coroutines.Job.cancel] when the session ends.
14+
*
15+
* This API extension exists on [StatefulWorkflow] as well, but it is confusing because the version
16+
* of [initialState] that does not have the [CoroutineScope] must also be implemented as it is
17+
* an abstract fun, even though it would never be used.
18+
* With this version, that confusion is removed and only the version of [initialState] with the
19+
* [CoroutineScope] must be implemented.
20+
*/
21+
@WorkflowExperimentalApi
22+
public abstract class SessionWorkflow<
23+
in PropsT,
24+
StateT,
25+
out OutputT,
26+
out RenderingT
27+
> : StatefulWorkflow<PropsT, StateT, OutputT, RenderingT>() {
28+
29+
/**
30+
* @see [StatefulWorkflow.initialState] for kdoc on the base function of this method.
31+
*
32+
* This version adds the following:
33+
* @param workflowScope A [CoroutineScope] that has been created when this Workflow is first
34+
* rendered and canceled when it is no longer rendered.
35+
*
36+
* This [CoroutineScope] can be used to:
37+
*
38+
* - set reliable teardown hooks, e.g. via [Job.invokeOnCompletion][kotlinx.coroutines.Job.invokeOnCompletion].
39+
*
40+
* - own the transforms on a [StateFlow][kotlinx.coroutines.flow.StateFlow],
41+
* linking them to the lifetime of a Workflow session. For example,
42+
* here is how you might safely combine two `StateFlow`s:
43+
*
44+
* data class MyState(
45+
* val derivedValue: String,
46+
* val derivedWorker: Worker<String>
47+
* )
48+
*
49+
* override fun initialState(
50+
* props: Unit,
51+
* snapshot: Snapshot?,
52+
* workflowScope: CoroutineScope
53+
* ): MyState {
54+
* val transformedStateFlow = stateFlow1.combine(stateFlow2, {val1, val2 -> val1 - val2}).
55+
* stateIn(workflowScope, SharingStarted.Eagerly, ${stateFlow1.value}-${stateFlow2.value})
56+
*
57+
* return MyState(
58+
* transformedStateFlow.value,
59+
* transformedStateFlow.asWorker()
60+
* )
61+
* }
62+
*
63+
* **Note Carefully**: Neither [workflowScope] nor any of these transformed/computed dependencies
64+
* should be stored by this Workflow instance. This could be re-created, or re-used unexpectedly
65+
* and should not have its own state. Instead, the transformed/computed dependencies must be
66+
* put into the [StateT] of this Workflow in order to be properly maintained.
67+
*/
68+
public abstract override fun initialState(
69+
props: PropsT,
70+
snapshot: Snapshot?,
71+
workflowScope: CoroutineScope
72+
): StateT
73+
74+
/**
75+
* Do not use this in favor of the version of [initialState] above that includes the Workflow's
76+
* [CoroutineScope]
77+
*/
78+
public final override fun initialState(
79+
props: PropsT,
80+
snapshot: Snapshot?
81+
): StateT {
82+
error("SessionWorkflow should never call initialState without the CoroutineScope.")
83+
}
84+
}
85+
86+
/**
87+
* Returns a [SessionWorkflow] implemented via the given functions.
88+
*/
89+
@WorkflowExperimentalApi
90+
public inline fun <PropsT, StateT, OutputT, RenderingT> Workflow.Companion.sessionWorkflow(
91+
crossinline initialState: (PropsT, Snapshot?, CoroutineScope) -> StateT,
92+
crossinline render: BaseRenderContext<PropsT, StateT, OutputT>.(
93+
props: PropsT,
94+
state: StateT
95+
) -> RenderingT,
96+
crossinline snapshot: (StateT) -> Snapshot?,
97+
crossinline onPropsChanged: (
98+
old: PropsT,
99+
new: PropsT,
100+
state: StateT
101+
) -> StateT = { _, _, state -> state }
102+
): SessionWorkflow<PropsT, StateT, OutputT, RenderingT> =
103+
object : SessionWorkflow<PropsT, StateT, OutputT, RenderingT>() {
104+
override fun initialState(
105+
props: PropsT,
106+
snapshot: Snapshot?,
107+
workflowScope: CoroutineScope
108+
): StateT = initialState(props, snapshot, workflowScope)
109+
110+
override fun onPropsChanged(
111+
old: PropsT,
112+
new: PropsT,
113+
state: StateT
114+
): StateT = onPropsChanged(old, new, state)
115+
116+
override fun render(
117+
renderProps: PropsT,
118+
renderState: StateT,
119+
context: RenderContext
120+
): RenderingT = render(context, renderProps, renderState)
121+
122+
override fun snapshotState(state: StateT) = snapshot(state)
123+
}
124+
125+
/**
126+
* Returns a [SessionWorkflow], with no props, implemented via the given functions.
127+
*/
128+
@WorkflowExperimentalApi
129+
public inline fun <StateT, OutputT, RenderingT> Workflow.Companion.sessionWorkflow(
130+
crossinline initialState: (Snapshot?, CoroutineScope) -> StateT,
131+
crossinline render: BaseRenderContext<Unit, StateT, OutputT>.(state: StateT) -> RenderingT,
132+
crossinline snapshot: (StateT) -> Snapshot?
133+
): SessionWorkflow<Unit, StateT, OutputT, RenderingT> = sessionWorkflow(
134+
{ _, initialSnapshot, workflowScope -> initialState(initialSnapshot, workflowScope) },
135+
{ _, state -> render(state) },
136+
snapshot
137+
)
138+
139+
/**
140+
* Returns a [SessionWorkflow] implemented via the given functions.
141+
*
142+
* This overload does not support snapshotting, but there are other overloads that do.
143+
*/
144+
@WorkflowExperimentalApi
145+
public inline fun <PropsT, StateT, OutputT, RenderingT> Workflow.Companion.sessionWorkflow(
146+
crossinline initialState: (PropsT, CoroutineScope) -> StateT,
147+
crossinline render: BaseRenderContext<PropsT, StateT, OutputT>.(
148+
props: PropsT,
149+
state: StateT
150+
) -> RenderingT,
151+
crossinline onPropsChanged: (
152+
old: PropsT,
153+
new: PropsT,
154+
state: StateT
155+
) -> StateT = { _, _, state -> state }
156+
): SessionWorkflow<PropsT, StateT, OutputT, RenderingT> = sessionWorkflow(
157+
{ props, _, workflowScope -> initialState(props, workflowScope) },
158+
render,
159+
{ null },
160+
onPropsChanged
161+
)
162+
163+
/**
164+
* Returns a [SessionWorkflow], with no props, implemented via the given function.
165+
*
166+
* This overload does not support snapshots, but there are others that do.
167+
*/
168+
@WorkflowExperimentalApi
169+
public inline fun <StateT, OutputT, RenderingT> Workflow.Companion.sessionWorkflow(
170+
crossinline initialState: (CoroutineScope) -> StateT,
171+
crossinline render: BaseRenderContext<Unit, StateT, OutputT>.(state: StateT) -> RenderingT
172+
): SessionWorkflow<Unit, StateT, OutputT, RenderingT> = sessionWorkflow(
173+
{ _, workflowScope -> initialState(workflowScope) },
174+
{ _, state -> render(state) }
175+
)

workflow-core/src/commonMain/kotlin/com/squareup/workflow1/StatefulWorkflow.kt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1-
@file:Suppress("DEPRECATION")
21
@file:JvmMultifileClass
32
@file:JvmName("Workflows")
43

54
package com.squareup.workflow1
65

76
import com.squareup.workflow1.StatefulWorkflow.RenderContext
87
import com.squareup.workflow1.WorkflowAction.Companion.toString
9-
import kotlin.LazyThreadSafetyMode.NONE
8+
import kotlinx.coroutines.CoroutineScope
109
import kotlin.jvm.JvmMultifileClass
1110
import kotlin.jvm.JvmName
1211

@@ -93,6 +92,18 @@ public abstract class StatefulWorkflow<
9392
snapshot: Snapshot?
9493
): StateT
9594

95+
/**
96+
* @see [SessionWorkflow.initialState].
97+
* This method should only be used with a [SessionWorkflow]. It's just a pass through here so
98+
* that we can add this behavior for [SessionWorkflow] without disrupting all [StatefulWorkflow]s.
99+
*/
100+
@WorkflowExperimentalApi
101+
public open fun initialState(
102+
props: PropsT,
103+
snapshot: Snapshot?,
104+
workflowScope: CoroutineScope
105+
): StateT = initialState(props, snapshot)
106+
96107
/**
97108
* Called from [RenderContext.renderChild] instead of [initialState] when the workflow is already
98109
* running. This allows the workflow to detect changes in props, and possibly change its state in
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.squareup.workflow1
2+
3+
import kotlin.RequiresOptIn.Level.ERROR
4+
import kotlin.annotation.AnnotationRetention.BINARY
5+
6+
/**
7+
* This is used to mark new core Workflow API that is still considered experimental.
8+
*/
9+
@Target(
10+
AnnotationTarget.CLASS,
11+
AnnotationTarget.PROPERTY,
12+
AnnotationTarget.FUNCTION,
13+
AnnotationTarget.TYPEALIAS
14+
)
15+
@MustBeDocumented
16+
@Retention(value = BINARY)
17+
@RequiresOptIn(level = ERROR)
18+
public annotation class WorkflowExperimentalApi

workflow-runtime/api/workflow-runtime.api

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
public final class com/squareup/workflow1/NoopWorkflowInterceptor : com/squareup/workflow1/WorkflowInterceptor {
22
public static final field INSTANCE Lcom/squareup/workflow1/NoopWorkflowInterceptor;
3-
public fun onInitialState (Ljava/lang/Object;Lcom/squareup/workflow1/Snapshot;Lkotlin/jvm/functions/Function2;Lcom/squareup/workflow1/WorkflowInterceptor$WorkflowSession;)Ljava/lang/Object;
3+
public fun onInitialState (Ljava/lang/Object;Lcom/squareup/workflow1/Snapshot;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function3;Lcom/squareup/workflow1/WorkflowInterceptor$WorkflowSession;)Ljava/lang/Object;
44
public fun onPropsChanged (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lcom/squareup/workflow1/WorkflowInterceptor$WorkflowSession;)Ljava/lang/Object;
55
public fun onRender (Ljava/lang/Object;Ljava/lang/Object;Lcom/squareup/workflow1/BaseRenderContext;Lkotlin/jvm/functions/Function3;Lcom/squareup/workflow1/WorkflowInterceptor$WorkflowSession;)Ljava/lang/Object;
66
public fun onRenderAndSnapshot (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Lcom/squareup/workflow1/WorkflowInterceptor$WorkflowSession;)Lcom/squareup/workflow1/RenderingAndSnapshot;
@@ -41,7 +41,7 @@ public class com/squareup/workflow1/SimpleLoggingWorkflowInterceptor : com/squar
4141
protected fun logAfterMethod (Ljava/lang/String;Lcom/squareup/workflow1/WorkflowInterceptor$WorkflowSession;[Lkotlin/Pair;)V
4242
protected fun logBeforeMethod (Ljava/lang/String;Lcom/squareup/workflow1/WorkflowInterceptor$WorkflowSession;[Lkotlin/Pair;)V
4343
protected fun logError (Ljava/lang/String;)V
44-
public fun onInitialState (Ljava/lang/Object;Lcom/squareup/workflow1/Snapshot;Lkotlin/jvm/functions/Function2;Lcom/squareup/workflow1/WorkflowInterceptor$WorkflowSession;)Ljava/lang/Object;
44+
public fun onInitialState (Ljava/lang/Object;Lcom/squareup/workflow1/Snapshot;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function3;Lcom/squareup/workflow1/WorkflowInterceptor$WorkflowSession;)Ljava/lang/Object;
4545
public fun onPropsChanged (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lcom/squareup/workflow1/WorkflowInterceptor$WorkflowSession;)Ljava/lang/Object;
4646
public fun onRender (Ljava/lang/Object;Ljava/lang/Object;Lcom/squareup/workflow1/BaseRenderContext;Lkotlin/jvm/functions/Function3;Lcom/squareup/workflow1/WorkflowInterceptor$WorkflowSession;)Ljava/lang/Object;
4747
public fun onRenderAndSnapshot (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Lcom/squareup/workflow1/WorkflowInterceptor$WorkflowSession;)Lcom/squareup/workflow1/RenderingAndSnapshot;
@@ -66,7 +66,7 @@ public abstract interface annotation class com/squareup/workflow1/WorkflowExperi
6666
}
6767

6868
public abstract interface class com/squareup/workflow1/WorkflowInterceptor {
69-
public abstract fun onInitialState (Ljava/lang/Object;Lcom/squareup/workflow1/Snapshot;Lkotlin/jvm/functions/Function2;Lcom/squareup/workflow1/WorkflowInterceptor$WorkflowSession;)Ljava/lang/Object;
69+
public abstract fun onInitialState (Ljava/lang/Object;Lcom/squareup/workflow1/Snapshot;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function3;Lcom/squareup/workflow1/WorkflowInterceptor$WorkflowSession;)Ljava/lang/Object;
7070
public abstract fun onPropsChanged (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lcom/squareup/workflow1/WorkflowInterceptor$WorkflowSession;)Ljava/lang/Object;
7171
public abstract fun onRender (Ljava/lang/Object;Ljava/lang/Object;Lcom/squareup/workflow1/BaseRenderContext;Lkotlin/jvm/functions/Function3;Lcom/squareup/workflow1/WorkflowInterceptor$WorkflowSession;)Ljava/lang/Object;
7272
public abstract fun onRenderAndSnapshot (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Lcom/squareup/workflow1/WorkflowInterceptor$WorkflowSession;)Lcom/squareup/workflow1/RenderingAndSnapshot;
@@ -76,7 +76,7 @@ public abstract interface class com/squareup/workflow1/WorkflowInterceptor {
7676
}
7777

7878
public final class com/squareup/workflow1/WorkflowInterceptor$DefaultImpls {
79-
public static fun onInitialState (Lcom/squareup/workflow1/WorkflowInterceptor;Ljava/lang/Object;Lcom/squareup/workflow1/Snapshot;Lkotlin/jvm/functions/Function2;Lcom/squareup/workflow1/WorkflowInterceptor$WorkflowSession;)Ljava/lang/Object;
79+
public static fun onInitialState (Lcom/squareup/workflow1/WorkflowInterceptor;Ljava/lang/Object;Lcom/squareup/workflow1/Snapshot;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function3;Lcom/squareup/workflow1/WorkflowInterceptor$WorkflowSession;)Ljava/lang/Object;
8080
public static fun onPropsChanged (Lcom/squareup/workflow1/WorkflowInterceptor;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lcom/squareup/workflow1/WorkflowInterceptor$WorkflowSession;)Ljava/lang/Object;
8181
public static fun onRender (Lcom/squareup/workflow1/WorkflowInterceptor;Ljava/lang/Object;Ljava/lang/Object;Lcom/squareup/workflow1/BaseRenderContext;Lkotlin/jvm/functions/Function3;Lcom/squareup/workflow1/WorkflowInterceptor$WorkflowSession;)Ljava/lang/Object;
8282
public static fun onRenderAndSnapshot (Lcom/squareup/workflow1/WorkflowInterceptor;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Lcom/squareup/workflow1/WorkflowInterceptor$WorkflowSession;)Lcom/squareup/workflow1/RenderingAndSnapshot;

0 commit comments

Comments
 (0)