Skip to content

Commit 55db768

Browse files
committed
StateFlow implementation
StateFlow is a Flow analogue to ConflatedBroadcastChannel. Since Flow API is simpler than channels APIs, the implementation of StateFlow is simpler. It consumes and allocates less memory, while still providing full deadlock-freedom (even though it is not lock-free internally). Fixes #1973
1 parent d5766f3 commit 55db768

File tree

8 files changed

+871
-14
lines changed

8 files changed

+871
-14
lines changed

kotlinx-coroutines-core/api/kotlinx-coroutines-core.api

+42-3
Original file line numberDiff line numberDiff line change
@@ -974,6 +974,7 @@ public final class kotlinx/coroutines/flow/FlowKt {
974974
public static final fun skip (Lkotlinx/coroutines/flow/Flow;I)Lkotlinx/coroutines/flow/Flow;
975975
public static final fun startWith (Lkotlinx/coroutines/flow/Flow;Ljava/lang/Object;)Lkotlinx/coroutines/flow/Flow;
976976
public static final fun startWith (Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow;
977+
public static final fun stateIn (Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
977978
public static final fun subscribe (Lkotlinx/coroutines/flow/Flow;)V
978979
public static final fun subscribe (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)V
979980
public static final fun subscribe (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;)V
@@ -993,7 +994,38 @@ public final class kotlinx/coroutines/flow/FlowKt {
993994
public static final fun zip (Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow;
994995
}
995996

996-
public abstract class kotlinx/coroutines/flow/internal/ChannelFlow : kotlinx/coroutines/flow/Flow {
997+
public abstract interface class kotlinx/coroutines/flow/MutableStateFlow : kotlinx/coroutines/flow/StateFlow {
998+
public abstract fun close (Ljava/lang/Throwable;)Z
999+
public abstract fun getValue ()Ljava/lang/Object;
1000+
public abstract fun setValue (Ljava/lang/Object;)V
1001+
}
1002+
1003+
public final class kotlinx/coroutines/flow/MutableStateFlow$DefaultImpls {
1004+
public static synthetic fun close$default (Lkotlinx/coroutines/flow/MutableStateFlow;Ljava/lang/Throwable;ILjava/lang/Object;)Z
1005+
}
1006+
1007+
public abstract interface class kotlinx/coroutines/flow/StateFlow : kotlinx/coroutines/flow/Flow {
1008+
public abstract fun getValue ()Ljava/lang/Object;
1009+
public abstract fun isClosed ()Z
1010+
}
1011+
1012+
public abstract interface class kotlinx/coroutines/flow/StateFlowJob : kotlinx/coroutines/Job, kotlinx/coroutines/flow/StateFlow {
1013+
}
1014+
1015+
public final class kotlinx/coroutines/flow/StateFlowJob$DefaultImpls {
1016+
public static synthetic fun cancel (Lkotlinx/coroutines/flow/StateFlowJob;)V
1017+
public static fun fold (Lkotlinx/coroutines/flow/StateFlowJob;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;
1018+
public static fun get (Lkotlinx/coroutines/flow/StateFlowJob;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element;
1019+
public static fun minusKey (Lkotlinx/coroutines/flow/StateFlowJob;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext;
1020+
public static fun plus (Lkotlinx/coroutines/flow/StateFlowJob;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext;
1021+
public static fun plus (Lkotlinx/coroutines/flow/StateFlowJob;Lkotlinx/coroutines/Job;)Lkotlinx/coroutines/Job;
1022+
}
1023+
1024+
public final class kotlinx/coroutines/flow/StateFlowKt {
1025+
public static final fun StateFlow (Ljava/lang/Object;)Lkotlinx/coroutines/flow/MutableStateFlow;
1026+
}
1027+
1028+
public abstract class kotlinx/coroutines/flow/internal/ChannelFlow : kotlinx/coroutines/flow/internal/FusibleFlow {
9971029
public final field capacity I
9981030
public final field context Lkotlin/coroutines/CoroutineContext;
9991031
public fun <init> (Lkotlin/coroutines/CoroutineContext;I)V
@@ -1002,10 +1034,9 @@ public abstract class kotlinx/coroutines/flow/internal/ChannelFlow : kotlinx/cor
10021034
public fun collect (Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
10031035
protected abstract fun collectTo (Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
10041036
protected abstract fun create (Lkotlin/coroutines/CoroutineContext;I)Lkotlinx/coroutines/flow/internal/ChannelFlow;
1037+
public fun fuse (Lkotlin/coroutines/CoroutineContext;I)Lkotlinx/coroutines/flow/internal/FusibleFlow;
10051038
public fun produceImpl (Lkotlinx/coroutines/CoroutineScope;)Lkotlinx/coroutines/channels/ReceiveChannel;
10061039
public fun toString ()Ljava/lang/String;
1007-
public final fun update (Lkotlin/coroutines/CoroutineContext;I)Lkotlinx/coroutines/flow/internal/ChannelFlow;
1008-
public static synthetic fun update$default (Lkotlinx/coroutines/flow/internal/ChannelFlow;Lkotlin/coroutines/CoroutineContext;IILjava/lang/Object;)Lkotlinx/coroutines/flow/internal/ChannelFlow;
10091040
}
10101041

10111042
public final class kotlinx/coroutines/flow/internal/CombineKt {
@@ -1016,6 +1047,14 @@ public final class kotlinx/coroutines/flow/internal/FlowExceptions_commonKt {
10161047
public static final fun checkIndexOverflow (I)I
10171048
}
10181049

1050+
public abstract interface class kotlinx/coroutines/flow/internal/FusibleFlow : kotlinx/coroutines/flow/Flow {
1051+
public abstract fun fuse (Lkotlin/coroutines/CoroutineContext;I)Lkotlinx/coroutines/flow/internal/FusibleFlow;
1052+
}
1053+
1054+
public final class kotlinx/coroutines/flow/internal/FusibleFlow$DefaultImpls {
1055+
public static synthetic fun fuse$default (Lkotlinx/coroutines/flow/internal/FusibleFlow;Lkotlin/coroutines/CoroutineContext;IILjava/lang/Object;)Lkotlinx/coroutines/flow/internal/FusibleFlow;
1056+
}
1057+
10191058
public final class kotlinx/coroutines/flow/internal/SafeCollector_commonKt {
10201059
public static final fun unsafeFlow (Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow;
10211060
}

0 commit comments

Comments
 (0)