Skip to content

Commit 37c8702

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 Fixes #395 Fixes #1816
1 parent de38890 commit 37c8702

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
@@ -979,6 +979,7 @@ public final class kotlinx/coroutines/flow/FlowKt {
979979
public static final fun skip (Lkotlinx/coroutines/flow/Flow;I)Lkotlinx/coroutines/flow/Flow;
980980
public static final fun startWith (Lkotlinx/coroutines/flow/Flow;Ljava/lang/Object;)Lkotlinx/coroutines/flow/Flow;
981981
public static final fun startWith (Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow;
982+
public static final fun stateIn (Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
982983
public static final fun subscribe (Lkotlinx/coroutines/flow/Flow;)V
983984
public static final fun subscribe (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)V
984985
public static final fun subscribe (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;)V
@@ -998,7 +999,38 @@ public final class kotlinx/coroutines/flow/FlowKt {
998999
public static final fun zip (Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow;
9991000
}
10001001

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

10161047
public final class kotlinx/coroutines/flow/internal/CombineKt {
@@ -1021,6 +1052,14 @@ public final class kotlinx/coroutines/flow/internal/FlowExceptions_commonKt {
10211052
public static final fun checkIndexOverflow (I)I
10221053
}
10231054

1055+
public abstract interface class kotlinx/coroutines/flow/internal/FusibleFlow : kotlinx/coroutines/flow/Flow {
1056+
public abstract fun fuse (Lkotlin/coroutines/CoroutineContext;I)Lkotlinx/coroutines/flow/internal/FusibleFlow;
1057+
}
1058+
1059+
public final class kotlinx/coroutines/flow/internal/FusibleFlow$DefaultImpls {
1060+
public static synthetic fun fuse$default (Lkotlinx/coroutines/flow/internal/FusibleFlow;Lkotlin/coroutines/CoroutineContext;IILjava/lang/Object;)Lkotlinx/coroutines/flow/internal/FusibleFlow;
1061+
}
1062+
10241063
public final class kotlinx/coroutines/flow/internal/SafeCollector_commonKt {
10251064
public static final fun unsafeFlow (Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow;
10261065
}

0 commit comments

Comments
 (0)